2025-05-14
Sequential Data 可以有两个作用. 一个是 Fitting,另一个是 Generation.
大语言模型中是基于每个 word 的.
Truncation:训练的时候限制 Sequence 的长度,否则 backward 太耗时了. 每次训练使用一个长度为 \(t\) 的 Chunk of sequence,来形成一个 data point,进行 \(t\) 次 backward.
但是一个 chunk 的 \(h_0\) 怎么来呢?一个方法是 forward 的时候 forward 一整个 sequence,backward 的时候在 chunk 里面 backward,好处是 \(h_0\) 可以记录上文 context 的信息. 但是这个问题就是每个 Iteration 都要 forward 一遍,太耗时间了. 所以另一个方法就是直接 \(h_0=0\).
使用 Chunk 的代价是根本没有长时间的记忆,只有最多 \(t\) 长度的时间的记忆.
如果每次贪心选择概率最大的作为下一个词,那么只能获得一个可能的句子. 一个方法是采用 Weighted Sampling,按概率随机采样一个作为下一个词. 但是这个显然太垃圾了.
Beam Search:取一个 \(k\) 作为 Beam Size,先 sample top K 个,然后每个再 sample top K,然后在这 \(k^2\) 个中挑选概率乘积最大的 top \(k\),然后继续下去. 每次就是 \(k\to k^2\to k\to k^2\to \dots\). 这个方法权衡了效率和优性.
Vanilla RNN 的梯度消失问题. 很显然.
梯度爆炸可以用 gradient clipping,将其方向不变然后缩小. 但是 Gradient 小的时候,对噪声很敏感,所以不能放大.
LSTM 中 forget gate 那一条路形成了一个 uninterrupted gradient flow. 这是因为长期记忆和新来的状态是一个 Additive Interaction.
剩下 LSTM 没啥额外的东西.
Seq2seq:先对输入得到最终隐藏状态 \(c\),然后输出的时候将\(y_i\) 和 \(c\) concat 起来得到然后算得 \(y_{i+1}\). 引入 START token 作为 \(y_0\),然后和一个 STOP token.
Image Capturing:给一个图,输出一段话去形容. 这个和 Seq2seq 内容类似,将 CNN 提出的 feature 作为 \(c\) 即可. 训练上,CNN 先用 Imagenet 的 CNN,然后要么寻 Capturing 的时候 freeze 住这个 CNN,要么做一个 fine tune. Freeze 的话,forward 的时候 memory 一样,backward 的时候 memory 开销被减小.
Visual Question Answering:给图和文字然后回答问题. 也是一样的. 是一个 Multimodal Understanding 的任务. 但将模态分开处理后,就做的很烂.
信息融合(Information Fusion)可以用直接相加,相乘,或者 concatenate.
Ablation Study:别的不变改变一个东西,去测试是会改变结果.
考虑我们 s2s 的一个问题,就是 decoder 只能看到一个 \(c\). 我们希望输出的时候能看到 Encoder 的 \(h\).
令一个注意力 MLP \(f_{a}\),\(e_{t,j}=f_a(s_{t-1},h_j)\),然后对 \(e\) 做 softmax 得到注意力权重 \(a\),于是得到这一步的 \(c_t=\sum a_{t,j}h_j\),然后再让 \([c_t\ y_{t-1}\ s_{t-1}]\) 计算获得 \(y_t\).