Seq2Seq理解
写在前面:学习Seq2Seq由于前面底子没打好导致理解起来非常困难,今天索性全部搞懂逻辑部分,后续我会把所学的一些算法全部以理解+代码的形式发布出来,课程代码内容全部来自李沐老师的视频,再次感谢!
直入主题
当前只有理解,没有概念等内容
Seq2Seq的核心是编码器和解码器,以下例子为中文“我爱你”翻译成英文“I love you”
1.先输入中文“我爱你”,拆解成“我”,“爱”,“你”的三个嵌入词,在编码器Encoder中分别变为三个词向量[词向量1],[词向量2]和[词向量3]。
2.将[词向量1],[词向量2],[词向量3]一起丢给GRU1去学习,GRU1对简单的词的特征进行处理记忆的结果作为输入丢给GRU2;
3.GRU2继续从更高层次的捕获句子的时间依赖和上下文信息,
然后将结果作为输入再丢给GRU3;
4.GRU3提取更深层次的语义特征;而通过三层GRU学习后的结果也就是隐藏状态被叫做context(上下文向量)。
3.将解码器的最终隐藏状态context贯穿解码器当中。
4.[start] + context → GRU1 → “I”
刚开始直接通过GRU1学习上下文,得到第一个英文单词"I"
5.“I” + context → GRU → “love”
将已经得到的结果作为输入结合上下文进行学习,得到第二个单词"love"
6.“love” + context → GRU → “you”
将前两个的结果作为输入结合上下文进行学习,得到第三个单词"you"
7.最后通过拼接函数将"I ",“love”,“you”->“I love you”
核心理解
一.隐藏状态:隐藏状态就是神经网络记住信息的“记忆”
输入:X = [“I”, “am”, “happy”]
经过embedding后,每个词变成的向量为:
X = [v_I, v_am, v_happy]
GRU一步步读取向量的操作为:
时间步1: 输入 v_I → 生成隐藏状态 h_1(理解了"I")
时间步2: 输入 v_am + 上一个隐藏状态 h_1 → 得到 h_2(理解了"I am")
时间步3: 输入 v_happy + h_2 → 得到 h_3(理解了"I am happy")
二.Dropout:防止过拟合的方法,在训练时,随机“丢掉”一部分神经元,让模型不要太依赖某些特征。
神经网络的输出为:[0.8, 0.5, 0.3, 0.9]
drop=0.5,训练时会随机把一半的值变成0
[0.8, 0.0, 0.0, 0.9]
好处:
1.模型更加鲁棒,不依赖单一神经元
2.更难死记硬背训练数据,防止过拟合
三.repeat():将 state[-1] 扩展成每个时间步都用同一个上下文向量:
为了每个时间步都能获得编码器的上下文信息,所以要在时间维度上复制。
四.context上下文: 是编码器最后一层最后一个时间步的隐藏状态
context = state[-1]
编码器读完整句后,对整句的“理解压缩”结果。
五.num_hiddens:是 GRU(或 LSTM、RNN)中隐藏状态的“向量维度”,不是处理句子长度,而是控制模型对每个时间步输入的“记忆能力”或“抽象表达能力”。
可以类比成大脑的记忆容量,隐藏状态越高,人能记住的东西就越多
假设你有一个 GRU:num_hiddens = 4
每个时间步输入词向量后,GRU 输出隐藏状态,比如:
h_t = [0.35, -0.21, 0.10, 0.78] ← 隐藏状态的维度 = 4
对“到当前时间步为止”的所有输入,GRU 试图总结成一个 4 维向量
六.batch_size:批量大小,指的是一次训练处理几句话,每句话有一个隐藏状态
七.num_layers:表示GRU有几层,就有几个隐藏状态
例如:
你用 2 层 GRU (num_layers=2)一次处理 3 句话 (batch_size=3)
每个隐藏状态是一个 4 维向量 (num_hiddens=4)
那么你最终的 state 长这样:state.shape == (2, 3, 4)
state[0][0] 是:第1层,第1句话的隐藏状态 (一个4维向量)
state[1][2] 是:第2层,第3句话的隐藏状态 (一个4维向量)
2*3=6,一共有6个隐藏状态向量
第1层:
第1句话的隐藏状态: [0.1, 0.2, -0.5, 0.7]
第2句话的隐藏状态: [0.4, -0.1, 0.9, 0.0]
第3句话的隐藏状态: [0.3, 0.8, -0.2, -0.1]
第2层:
第1句话的隐藏状态: [0.1, 0.2, -0.5, 0.7]
第2句话的隐藏状态: [0.4, -0.1, 0.9, 0.0]
第3句话的隐藏状态: [0.3, 0.8, -0.2, -0.1]
八.Seq2Seq并不是通过直接对应词汇翻译得到的,而是通过一步步根据上下文和自己组成的词,预测下一个词
九.num_hiddens 和 state 的关系:
num_hiddens 决定了每个隐藏状态向量的“维度”(表达能力有多强), state 是具体的隐藏状态“内容”(一组向量),它的形状受num_hiddens 控制