今天是11月26日,如果每天读一章并看完的话,这次挑战就算成功。
在老大和老二的各种干扰下,不知道能不能做到。
1. Dummy Transformer

在实现 GPT 模型的过程中,看到是从 PyTorch 里拿来一个 Transformer 的 dummy 模块用的。
一查才发现,在 PyTorch 的 nn 里已经实现了好几种 Transformer 模型。
把这些 Transformer 模型叫作 dummy(虚拟、空模)是因为它们虽然结构相同,但还没有经过训练。
2. 正规化(归一化)
进入 Transformer Block 的这些值中,如果某一个维度特别大,数据就会朝那个方向倾斜。
因此要把数值转换成均值为 0、方差为 1 的分布。
然后在 Feed Forward Network 里,先用 Linear 把维度扩展,再做非线性变换。
这时候会用到 ReLU 或 GELU 这样的非线性激活函数。

据说相比 ReLU,GELU 更“平滑/近似线性”,因此参数会更容易调整。
而且在每个 Block 里,都会通过 Linear 函数先把维度拉高,再缩回来。
把维度拉高之后,就能进行更丰富的非线性探索。
比如有苹果、橙子和胡萝卜,就好像对这些食材进行汆烫、烧烤、剁碎、混合等各种不同方式的烹饪。
然后把做好的各种料理再集中起来,把精华重新压缩回原来的维度里。

3. Shortcut(残差捷径)
训练是从发生损失的地方开始往前传,所以会反向一路追溯回去。
比如说,假设二楼在漏水。
那就往上到三楼、四楼、五楼,反向去查到底是哪里开始漏的。
这就是所谓的反向传播(backpropagation)。

但像上图那样构建的模型,每经过一个线性层,梯度都会衰减(消失)。
梯度消失的意思是,在反向传播过程中,越深的层几乎得不到训练,这样一来堆很多层就失去意义。
所以会在每个线性层里,把输入值和输出值相加,提供一条防止梯度消失的“旁路”。
这一点用数学来理解会更直观。
Residual 과정 : y = x + F(x)
backward 과정 : dL/dx = dL/dy * (1 + dF/dx)
최종 gradient : dL/dy * (1 + dF/dx)在反向传播的过程中,由于在每一层的梯度中都会额外加上一个 1,这个 1 总是被保证存在,因此每一层的梯度都不会完全消失。
从而可以更有效地辅助训练过程。
4. 构建 GPT 模型
接下来,把这样构建好的 dummy 模型与 Attention 模块连接起来。
最后再让这个 Attention 模块可以重复多次,然后对输出的 token 进行重新解码就可以了。

5. 后记
一开始内容还挺轻松,越往后看越吃力。
从代码角度看会觉得难,但如果通过比喻和象征来学,其实也没有那么可怕。
现在时代变了,比起死记硬背,更重要的是“理解”。
只会背是创造不出新的东西的,但只要理解了,就能在人工智能的帮助下完成自己的 GPT。
虽然剩下的时间不多了,但还是打算尽量去理解透。
댓글을 불러오는 중...