吴恩达深度学习笔记-lesson5 序列模型(Sequence Models)
这份笔记详细介绍了序列模型的基础概念和应用,包括循环神经网络(RNN)、长短期记忆网络(LSTM)、门控循环单元(GRU)等模型。它涵盖了词嵌入技术,如Word2Vec和GloVe,以及去除偏见的方法。笔记还讨论了注意力机制在处理长序列依赖问题中的重要性,并介绍了自然语言处理中的关键概念和方法。
文章目录
-
-
- Week 1 循环序列模型(Recurrent Neural Networks)
-
- 5.1.1 为什么选择序列模型?(Why Sequence Models?)
- 5.1.2 数学符号(Notation)
- 5.1.3 循环神经网络模型(Recurrent Neural Network Model)
- 5.1.4 通过时间的反向传播(Backpropagation through time)
- 5.1.5 不同类型的循环神经网络(Different types of **RNN**s)
- 5.1.6 语言模型和序列生成(Language model and sequence generation)
- 5.1.7 对新序列采样(Sampling novel sequences)
- 5.1.8 循环神经网络的梯度消失(Vanishing gradients with RNNs)
- 5.1.9 **GRU**单元(Gated Recurrent Unit(**GRU**))
- 5.1.10 长短期记忆(**LSTM**(long short term memory)unit)
- 5.1.11 双向循环神经网络(Bidirectional **RNN**)
- 5.1.12 深层循环神经网络(Deep **RNN**s)
- Week 2 自然语言处理与词嵌入(Natural Language Processing and Word Embeddings)
-
- 5.2.1 词汇表征(Word Representation)
- 5.2.2 使用词嵌入(Using Word Embeddings)
- 5.2.3 词嵌入的特性(Properties of Word Embeddings)
- 5.2.4 嵌入矩阵(Embedding Matrix)
- 5.2.5 学习词嵌入(Learning Word Embeddings)
- 5.2.6 Word2Vec
- 5.2.7 负采样(Negative Sampling)
- 5.2.8 GloVe 词向量(GloVe Word Vectors)
- 5.2.9 情感分类(Sentiment Classification)
- 5.2.10 词嵌入除偏(Debiasing Word Embeddings)
- Week 3 序列模型和注意力机制(Sequence Models & Attention Mechanism)
-
Week 1 循环序列模型(Recurrent Neural Networks)
5.1.1 为什么选择序列模型?(Why Sequence Models?)
应用:
- 语音识别
- 音乐生成
- 情感分类
- DNA测序分析
- 视频行为识别
- ……
5.1.2 数学符号(Notation)
例:一段语音由 n n n个单词组成,则用 x < t > x^{<t>} x<t>索引,输出同理( y < t > y^{<t>} y<t>)
T x T_x Tx表示输入序列据的长度, T y T_y Ty表示输出序列的长度
训练样本i的序列中第 t t t个元素用 x ( i ) < t > x^{\left(i \right) <t>} x(i)<t>这个符号来表示, T x ( i ) T_{x}^{(i)} Tx(i)就代表第 i i i个训练样本的输入序列长度
表示一个句子里单个的词:
- 创建一个词典
- 用one-hot表示法表示每一个单词,如
y = [ 0 ⋮ 1 0 0 ] y = \begin{bmatrix} 0 \\ \vdots \\ 1 \\ 0 \\ 0 \\ \end{bmatrix} y= 0⋮100
如果遇到了一个不在你词表中的单词,可创建一个新的标记,也就是一个叫做Unknow Word的伪造单词,用<UNK>作为标记
5.1.3 循环神经网络模型(Recurrent Neural Network Model)
若用标准神经网络模型,缺点:
-
是输入和输出数据在不同例子中可以有不同的长度
-
这样单纯的神经网络结构并不共享从文本的不同位置上学到的特征
-
输入层、参数过于庞大
循环神经网络模型:将第一个词输入一个神经网络层,让神经网络尝试预测输出,判断这是否是人名的一部分,当它读到句中的第二个单词时,时间步 1 1 1的激活值就会传递到时间步 2 2 2。
零时刻需要构造一个激活值 a < 0 > a^{<0>} a<0>,这通常是零向量
循环神经网络是从左向右扫描数据,同时每个时间步的参数也是共享的。激活值也就是水平联系是由参数 W a a W_{aa} Waa决定的,同时每一个时间步都使用相同的参数 W a a W_{aa} Waa,同样的输出结果由 W y a W_{{ya}} Wya决定。

先输入 a < 0 > a^{<0>} a<0>,它是一个零向量。接着就是前向传播过程,先计算激活值 a < 1 > a^{<1>} a<1>,然后再计算 y < 1 > y^{<1>} y<1>。
a < 1 > = g 1 ( W a a a < 0 > + W a x x < 1 > + b a ) a^{<1>} = g_{1}(W_{{aa}}a^{< 0 >} + W_{{ax}}x^{< 1 >} + b_{a}) a<1>=g1(Waaa<0>+Waxx<1>+ba)
y ^ < 1 > = g 2 ( W y a a < 1 > + b y ) \hat y^{< 1 >} = g_{2}(W_{{ya}}a^{< 1 >} + b_{y}) y^<1>=g2(Wyaa<1>+by)
将这部分( W aa a < t − 1 > + W ax x < t > W_{\text{aa}}a^{<t -1>} +W_{\text{ax}}x^{<t>} Waaa<t−1>+Waxx<t>): a < t > = g ( W a [ a < t − 1 > , x < t > ] + b a ) a^{<t>} =g(W_{a}\left\lbrack a^{< t-1 >},x^{<t>} \right\rbrack +b_{a}) a<t>=g(Wa[a<t−1>,x<t>]+ba)
用这个符号( [ a < t − 1 > , x < t > ] \left\lbrack a^{< t - 1 >},x^{< t >}\right\rbrack [a<t−1>,x<t>])的意思是将这两个向量堆在一起,即 [ a < t − 1 > x < t > ] \begin{bmatrix}a^{< t-1 >} \\ x^{< t >} \\\end{bmatrix} [a<t−1>x<t>]
[ W a a ⋮ W a x ] = W a [ {{W}_{aa}}\vdots {{W}_{ax}}]=W_{a} [Waa⋮Wax]=Wa
而矩阵 [ W a a ⋮ W a x ] [ {{W}_{aa}}\vdots {{W}_{ax}}] [Waa⋮Wax]乘以 [ a < t − 1 > x < t > ] \begin{bmatrix} a^{< t - 1 >} \\ x^{< t >} \\ \end{bmatrix} [a<t−1>x<t>],刚好等于 W a a a < t − 1 > + W a x x < t > W_{{aa}}a^{<t-1>} + W_{{ax}}x^{<t>} Waaa<t−1>+Waxx<t>
所以:
-
y ^ < t > = g ( W y a < t > + b y ) \hat y^{< t >} = g(W_{y}a^{< t >} +b_{y}) y^<t>=g(Wya<t>+by)
-
a < t > = g ( W a [ a < t − 1 > , x < t > ] + b a ) a^{<t>} =g(W_{a}\left\lbrack a^{< t-1 >},x^{<t>} \right\rbrack +b_{a}) a<t>=g(Wa[a<t−1>,x<t>]+ba)
5.1.4 通过时间的反向传播(Backpropagation through time)
元素损失函数:
L < t > ( y ^ < t > , y < t > ) = − y < t > log y ^ < t > − ( 1 − y < t > ) l o g ( 1 − y ^ < t > ) L^{<t>}( \hat y^{<t>},y^{<t>}) = - y^{<t>}\log\hat y^{<t>}-( 1- y^{<t>})log(1-\hat y^{<t>}) L<t>(y^<t>,y<t>)=−y<t>logy^<t>−(1−y<t>)log(1−y^<t>)
整体损失函数:
L ( y ^ , y ) = ∑ t = 1 T x L < t > ( y ^ < t > , y < t > ) L(\hat y,y) = \ \sum_{t = 1}^{T_{x}}{L^{< t >}(\hat y^{< t >},y^{< t >})} L(y^,y)= t=1∑TxL<t>(y^<t>,y<t>)
反向传播示意图:

5.1.5 不同类型的循环神经网络(Different types of RNNs)
为实现一对一、一对多、多对一、多对多(两种),可以修改网络架构:

5.1.6 语言模型和序列生成(Language model and sequence generation)
语言模型:计算出各输出各自的可能性。
建立一个语言模型:
- 首先需要一个训练集,包含一个很大的文本语料库(corpus)
- 将数据标记化,建立一个字典,把输入的句子都映射到各个标志上
语料库是自然语言处理的一个专有名词,意思就是很长的或者说数量众多的英文句子组成的文本。
可能要定义句子的结尾,一般的做法就是增加一个额外的标记,叫做EOS。
遇到词典外的单词:把该单词替换成一个叫做UNK的代表未知词的标志,我们只针对UNK建立概率模型。
模型:
-
第一个时间步
-
输入: a < 0 > a^{<0>} a<0>、 x < 1 > x^{<1>} x<1>。一般皆设为 0 → \overrightarrow 0 0向量
-
计算:激活项 a < 1 > a^{<1>} a<1>
-
输出: y ^ < 1 > = softmax ( W y a a < 1 > + b y ) \hat{y}^{<1>} = \text{softmax}(W_{ya} a^{<1>} + b_y) y^<1>=softmax(Wyaa<1>+by)
-
-
第二个时间步
-
输入: a < 1 > a^{<1>} a<1>、 x < 2 > x^{<2>} x<2>
-
……
-
……
-
输出: y ^ < T y > \hat{y}^{<T_y>} y^<Ty>
-
代价函数:
在某个时间步 t t t,如果真正的词是 y < t > y^{<t>} y<t>,而神经网络的softmax层预测结果值是 y < t > y^{<t>} y<t>,则代价函数为:
L ( y ^ , y ) = − ∑ i y i log y ^ i L\left( \hat y^{},y^{}\right) = - \sum_{i}^{}{y_{i}^{}\log\hat y_{i}^{}} L(y^,y)=−i∑yilogy^i
总体损失函数:
L = ∑ t L < t > ( y ^ < t > , y < t > ) L = \sum_{t}^{}{L^{< t >}\left( \hat y^{<t>},y^{<t>} \right)} L=t∑L<t>(y^<t>,y<t>)
应用:给出句子的前几个单词 y < 1 > y^{<1>} y<1>, y < 2 > y^{<2>} y<2>, y < 3 > y^{<3>} y<3>。第一个softmax层计算 P ( y < 1 > ) P(y^{<1>}) P(y<1>),第二个softmax层计算 P ( y < 2 > ∣ y < 1 > ) P(y^{<2>}|y^{<1>}) P(y<2>∣y<1>)(有 y < 1 > y^{<1>} y<1>情况下 y < 2 > y^{<2>} y<2>的概率)……可对句子进行预测
5.1.7 对新序列采样(Sampling novel sequences)
输入 x < 1 > = 0 x^{<1>} =0 x<1>=0, a < 0 > = 0 a^{<0>} =0 a<0>=0,用numpy命令np.random.choice来根据向量中这些概率的分布进行采样
注意此时需要 y ^ < 1 > \hat y^{<1>} y^<1>作为输入,即用 y ^ < 1 > \hat y^{<1>} y^<1>代替 x < 2 > x^{<2>} x<2>
当出现EOS时,采样可以结束
若出现未知单词UNK,可在剩下的单词中重采样,也可以不予处理
基于字符的RNN结构:
-
优点:不必担心会出现未知的标识
-
缺点:捕捉句子中的依赖关系也就是句子较前部分如何影响较后部分不如基于词汇的语言模型、基于字符的语言模型训练起来计算成本比较高昂。
5.1.8 循环神经网络的梯度消失(Vanishing gradients with RNNs)
RNN模型不擅长捕获长期依赖效应,因为输出 y ^ \hat y y^得到的梯度很难传播回去,很难影响靠前层的权重,很难影响前面层的计算
RNN也可能出现梯度爆炸的情况,此情况较容易发现,因为此时数值会过大,会看到很多NaN,或者不是数字的情况
梯度爆炸解决方法:进行梯度修剪,如果参数某个阈值,缩放梯度向量,保证它不会太大
5.1.9 GRU单元(Gated Recurrent Unit(GRU))
c c c,即记忆细胞:作用是提供了记忆的能力
替代值: c ~ < t > = t a n h ( W c [ c < t − 1 > , x < t > ] + b c ) {\tilde{c}}^{<t>} =tanh(W_{c}\left\lbrack c^{<t-1>},x^{<t>} \right\rbrack +b_{c}) c~<t>=tanh(Wc[c<t−1>,x<t>]+bc)
门 Γ u \Gamma_{u} Γu: Γ u = σ ( W u [ c < t − 1 > , x < t > ] + b u ) \Gamma_{u}= \sigma(W_{u}\left\lbrack c^{<t-1>},x^{<t>} \right\rbrack +b_{u}) Γu=σ(Wu[c<t−1>,x<t>]+bu)
Γ u \Gamma_{u} Γu的输出值总是在0到1之间,对于大多数可能的输入,sigmoid函数的输出总是非常接近0或者非常接近1
更新或遗忘: c < t > = Γ u ∗ c ~ < t > + ( 1 − Γ u ) ∗ c < t − 1 > c^{<t>} = \Gamma_{u}*{\tilde{c}}^{<t>} +\left( 1- \Gamma_{u} \right)*c^{<t-1>} c<t>=Γu∗c~<t>+(1−Γu)∗c<t−1>
c < t > c^{<t>} c<t>可以是一个向量,如果你有100维的隐藏的激活值,那么 c < t > c^{<t>} c<t>也是100维的, c ~ < t > {\tilde{c}}^{<t>} c~<t>、 Γ u \Gamma_{u} Γu等也是相同的维度
完整的GRU单元:
c ~ < t > = tanh ( W c [ Γ u ∗ c < t − 1 > , x < t > ] + b c ) Γ u = σ ( W u [ c < t − 1 > , x < t > ] + b u ) Γ r = σ ( W r [ c < t − 1 > , x < t > ] + b r ) c < t > = Γ u ∗ c ~ < t > + ( 1 − Γ u ) ∗ c < t − 1 > \begin{aligned} \tilde{c}^{< t >} &= \tanh (W_c[\Gamma_u * c^{< t - 1 >}, x^{< t >}] + b_c) \\ \Gamma_u &= \sigma (W_u[c^{< t - 1 >}, x^{< t >}] + b_u) \\ \Gamma_r &= \sigma (W_r[c^{< t - 1 >}, x^{< t >}] + b_r) \\ c^{< t >} &= \Gamma_u * \tilde{c}^{< t >} + (1 - \Gamma_u) * c^{< t - 1 >} \end{aligned} c~<t>ΓuΓrc<t>=tanh(Wc[Γu∗c<t−1>,x<t>]+bc)=σ(Wu[c<t−1>,x<t>]+bu)=σ(Wr[c<t−1>,x<t>]+br)=Γu∗c~<t>+(1−Γu)∗c<t−1>
更新门 Γ u \Gamma_{u} Γu(the update gate)
相关门 Γ r \Gamma_{r} Γr(the relevance gate)
图示:

5.1.10 长短期记忆(LSTM(long short term memory)unit)
公式(与GRU对比):

输出门: Γ o \Gamma_{o} Γo(output gate)
遗忘门: Γ f \Gamma_{f} Γf(the forget gate)
图示:

LSTM相当容易把 c < 0 > c^{<0>} c<0>的值一直往下传递到右边,比如。这就是为什么LSTM和GRU非常擅长于长时间记忆某个值。
门值不仅取决于 a < t − 1 > a^{<t-1>} a<t−1>和 x < t > x^{<t>} x<t>,有时候也可以偷窥一下 c < t − 1 > c^{<t-1>} c<t−1>的值(上图编号13所示),这叫做“窥视孔连接”(peephole connection)
GRU的优点是这是个更加简单的模型,所以更容易创建一个更大的网络,而且它只有两个门,在计算性上也运行得更快,然后它可以扩大模型的规模。但是LSTM更加强大和灵活,因为它有三个门而不是两个。
LSTM反向传播计算:(略)
门求偏导:
d Γ o ⟨ t ⟩ = d a n e x t ⋅ tanh ( c n e x t ) ⋅ Γ o ⟨ t ⟩ ⋅ ( 1 − Γ o ⟨ t ⟩ ) (1) d \Gamma_o^{\langle t \rangle} = da_{next} \cdot \tanh(c_{next}) \cdot \Gamma_o^{\langle t \rangle} \cdot (1-\Gamma_o^{\langle t \rangle}) \tag{1} dΓo⟨t⟩=danext⋅tanh(cnext)⋅Γo⟨t⟩⋅(1−Γo⟨t⟩)(1)
d c ~ ⟨ t ⟩ = d c n e x t ⋅ Γ i ⟨ t ⟩ + Γ o ⟨ t ⟩ ( 1 − tanh ( c n e x t ) 2 ) ⋅ i t ⋅ d a n e x t ⋅ c ~ ⟨ t ⟩ ⋅ ( 1 − tanh ( c ~ ) 2 ) (2) d\tilde c^{\langle t \rangle} = dc_{next} \cdot \Gamma_i^{\langle t \rangle} + \Gamma_o^{\langle t \rangle} (1-\tanh(c_{next})^2) \cdot i_t \cdot da_{next} \cdot \tilde c^{\langle t \rangle} \cdot (1-\tanh(\tilde c)^2) \tag{2} dc~⟨t⟩=dcnext⋅Γi⟨t⟩+Γo⟨t⟩(1−tanh(cnext)2)⋅it⋅danext⋅c~⟨t⟩⋅(1−tanh(c~)2)(2)
d Γ u ⟨ t ⟩ = d c n e x t ⋅ c ~ ⟨ t ⟩ + Γ o ⟨ t ⟩ ( 1 − tanh ( c n e x t ) 2 ) ⋅ c ~ ⟨ t ⟩ ⋅ d a n e x t ⋅ Γ u ⟨ t ⟩ ⋅ ( 1 − Γ u ⟨ t ⟩ ) (3) d\Gamma_u^{\langle t \rangle} = dc_{next} \cdot \tilde c^{\langle t \rangle} + \Gamma_o^{\langle t \rangle} (1-\tanh(c_{next})^2) \cdot \tilde c^{\langle t \rangle} \cdot da_{next} \cdot \Gamma_u^{\langle t \rangle} \cdot (1-\Gamma_u^{\langle t \rangle}) \tag{3} dΓu⟨t⟩=dcnext⋅c~⟨t⟩+Γo⟨t⟩(1−tanh(cnext)2)⋅c~⟨t⟩⋅danext⋅Γu⟨t⟩⋅(1−Γu⟨t⟩)(3)
d Γ f ⟨ t ⟩ = d c n e x t ⋅ c ~ p r e v + Γ o ⟨ t ⟩ ( 1 − tanh ( c n e x t ) 2 ) ⋅ c p r e v ⋅ d a n e x t ⋅ Γ f ⟨ t ⟩ ⋅ ( 1 − Γ f ⟨ t ⟩ ) (4) d\Gamma_f^{\langle t \rangle} = dc_{next} \cdot \tilde c_{prev} + \Gamma_o^{\langle t \rangle} (1-\tanh(c_{next})^2) \cdot c_{prev} \cdot da_{next} \cdot \Gamma_f^{\langle t \rangle} \cdot (1-\Gamma_f^{\langle t \rangle}) \tag{4} dΓf⟨t⟩=dcnext⋅c~prev+Γo⟨t⟩(1−tanh(cnext)2)⋅cprev⋅danext⋅Γf⟨t⟩⋅(1−Γf⟨t⟩)(4)
参数求偏导 :
d W f = d Γ f ⟨ t ⟩ ⋅ ( a p r e v x t ) T (5) dW_f = d\Gamma_f^{\langle t \rangle} \cdot \begin{pmatrix} a_{prev} \\ x_t \end{pmatrix}^T \tag{5} dWf=dΓf⟨t⟩⋅(aprevxt)T(5)
d W u = d Γ u ⟨ t ⟩ ⋅ ( a p r e v x t ) T (6) dW_u = d\Gamma_u^{\langle t \rangle} \cdot \begin{pmatrix} a_{prev} \\ x_t \end{pmatrix}^T \tag{6} dWu=dΓu⟨t⟩⋅(aprevxt)T(6)
d W c = d c ~ ⟨ t ⟩ ⋅ ( a p r e v x t ) T (7) dW_c = d\tilde c^{\langle t \rangle} \cdot \begin{pmatrix} a_{prev} \\ x_t \end{pmatrix}^T \tag{7} dWc=dc~⟨t⟩⋅(aprevxt)T(7)
d W o = d Γ o ⟨ t ⟩ ⋅ ( a p r e v x t ) T (8) dW_o = d\Gamma_o^{\langle t \rangle} \cdot \begin{pmatrix} a_{prev} \\ x_t \end{pmatrix}^T \tag{8} dWo=dΓo⟨t⟩⋅(aprevxt)T(8)
为了计算 d b f , d b u , d b c , d b o db_f, db_u, db_c, db_o dbf,dbu,dbc,dbo 需要各自对 d Γ f ⟨ t ⟩ , d Γ u ⟨ t ⟩ , d c ~ ⟨ t ⟩ , d Γ o ⟨ t ⟩ d\Gamma_f^{\langle t \rangle}, d\Gamma_u^{\langle t \rangle}, d\tilde c^{\langle t \rangle}, d\Gamma_o^{\langle t \rangle} dΓf⟨t⟩,dΓu⟨t⟩,dc~⟨t⟩,dΓo⟨t⟩ 求和。
最后,计算隐藏状态、记忆状态和输入的偏导数:
d a p r e v = W f T ⋅ d Γ f ⟨ t ⟩ + W u T ⋅ d Γ u ⟨ t ⟩ + W c T ⋅ d c ~ ⟨ t ⟩ + W o T ⋅ d Γ o ⟨ t ⟩ (9) da_{prev} = W_f^T \cdot d\Gamma_f^{\langle t \rangle} + W_u^T \cdot d\Gamma_u^{\langle t \rangle} + W_c^T \cdot d\tilde c^{\langle t \rangle} + W_o^T \cdot d\Gamma_o^{\langle t \rangle} \tag{9} daprev=WfT⋅dΓf⟨t⟩+WuT⋅dΓu⟨t⟩+WcT⋅dc~⟨t⟩+WoT⋅dΓo⟨t⟩(9)
d c p r e v = d c n e x t ⋅ Γ f ⟨ t ⟩ + Γ o ⟨ t ⟩ ⋅ ( 1 − tanh ( c n e x t ) 2 ) ⋅ Γ f ⟨ t ⟩ ⋅ d a n e x t (10) dc_{prev} = dc_{next} \cdot \Gamma_f^{\langle t \rangle} + \Gamma_o^{\langle t \rangle} \cdot (1 - \tanh(c_{next})^2) \cdot \Gamma_f^{\langle t \rangle} \cdot da_{next} \tag{10} dcprev=dcnext⋅Γf⟨t⟩+Γo⟨t⟩⋅(1−tanh(cnext)2)⋅Γf⟨t⟩⋅danext(10)
d x ⟨ t ⟩ = W f T ⋅ d Γ f ⟨ t ⟩ + W u T ⋅ d Γ u ⟨ t ⟩ + W c T ⋅ d c ~ t + W o T ⋅ d Γ o ⟨ t ⟩ (11) dx^{\langle t \rangle} = W_f^T \cdot d\Gamma_f^{\langle t \rangle} + W_u^T \cdot d\Gamma_u^{\langle t \rangle} + W_c^T \cdot d\tilde c_t + W_o^T \cdot d\Gamma_o^{\langle t \rangle} \tag{11} dx⟨t⟩=WfT⋅dΓf⟨t⟩+WuT⋅dΓu⟨t⟩+WcT⋅dc~t+WoT⋅dΓo⟨t⟩(11)
5.1.11 双向循环神经网络(Bidirectional RNN)
有些问题中,当前时刻的输出不仅和之前的状态有关,还可能和未来的状态有关系。

5.1.12 深层循环神经网络(Deep RNNs)
要学习非常复杂的函数,通常我们会把RNN的多个层堆叠在一起构建更深的模型.

公式对应变化: a [ 2 ] < 3 > = g ( W a [ 2 ] [ a [ 2 ] < 2 > , a [ 1 ] < 3 > ] + b a [ 2 ] ) a^{\lbrack 2\rbrack < 3 >} = g(W_{a}^{\left\lbrack 2 \right\rbrack}\left\lbrack a^{\left\lbrack 2 \right\rbrack < 2 >},a^{\left\lbrack 1 \right\rbrack < 3 >} \right\rbrack + b_{a}^{\left\lbrack 2 \right\rbrack}) a[2]<3>=g(Wa[2][a[2]<2>,a[1]<3>]+ba[2])
对于RNN来说,有三层就已经不少了。由于时间的维度,RNN网络会变得相当大,即使只有很少的几层,很少会看到这种网络堆叠到100层,不过 y < t > y^{<t>} y<t>有可能替换为一个较深的标准网络
通常这些单元(上图编号3所示)没必要非是标准的RNN,最简单的RNN模型,也可以是GRU单元或者LSTM单元
Week 2 自然语言处理与词嵌入(Natural Language Processing and Word Embeddings)
5.2.1 词汇表征(Word Representation)
我们之前使用字典表示词,如man为第 5391 5391 5391个词,则表示为 O 5391 O_{5391} O5391
词汇表征:按词汇的特征给不同维度赋值,如man、women对于性别的关系赋值 1 1 1、 − 1 -1 −1。其他特征如年龄、是否高贵等
实际上,学习到的特征并不一定可以直接理解
可以使用t-SNE算法等算法将这些向量嵌入到一个二维空间,特征相似的点会挨得更近,该算法复杂而且很非线性
用这种特征向量表示的方法叫做词嵌入
5.2.2 使用词嵌入(Using Word Embeddings)
学习词嵌入的算法会考察非常大的文本集,这样可以考察大量的无标签的文本的训练集,可以是1亿个单词,甚至达到100亿。尽管你只有一个很小的训练集,可以使用迁移学习,把你从互联网上免费获得的大量的无标签文本中学习到的知识迁移到一个任务中。
使用词嵌入后向量会更加紧凑(维数更少,信息更多)
词嵌入常常用于训练集较小的情况
词嵌入和人脸编码之间有奇妙的关系,不同在于词嵌入的词典大小固定,每个词有一固定编码,而人脸有无穷多个
例:
| 男人 | 女人 | 国王 | 王后 | 苹果 | 橘子 | |
|---|---|---|---|---|---|---|
| 性别 | − 1 -1 −1 | 1 1 1 | − 0.95 -0.95 −0.95 | 0.97 0.97 0.97 | 0.00 0.00 0.00 | 0.01 0.01 0.01 |
| 尊贵 | 0.01 0.01 0.01 | 0.02 0.02 0.02 | 0.93 0.93 0.93 | 0.95 0.95 0.95 | − 0.01 -0.01 −0.01 | 0.00 0.00 0.00 |
| 年龄 | 0.03 0.03 0.03 | 0.02 0.02 0.02 | 0.70 0.70 0.70 | 0.69 0.69 0.69 | 0.03 0.03 0.03 | − 0.02 -0.02 −0.02 |
| 食物 | 0.09 0.09 0.09 | 0.01 0.01 0.01 | 0.02 0.02 0.02 | 0.01 0.01 0.01 | 0.95 0.95 0.95 | 0.97 0.97 0.97 |
5.2.3 词嵌入的特性(Properties of Word Embeddings)
类比推理:用一个四维向量来表示man,我们用 e man e_{\text{man}} eman表示,表示woman的嵌入向量称为 e woman e_{\text{woman}} ewoman。进行减法运算:
e man − e woman = [ − 1 0.01 0.03 0.09 ] − [ 1 0.02 0.02 0.01 ] = [ − 2 − 0.01 0.01 0.08 ] ≈ [ − 2 0 0 0 ] e_{\text{man}} - e_{\text{woman}} = \begin{bmatrix} -1 \\ 0.01 \\ 0.03 \\ 0.09 \\ \end{bmatrix} - \begin{bmatrix} 1 \\ 0.02 \\ 0.02 \\ 0.01 \\ \end{bmatrix} = \begin{bmatrix} -2 \\ -0.01 \\ 0.01 \\ 0.08 \\ \end{bmatrix} \approx \begin{bmatrix} -2 \\ 0 \\ 0 \\ 0 \\ \end{bmatrix} eman−ewoman= −10.010.030.09 − 10.020.020.01 = −2−0.010.010.08 ≈ −2000
这个结果表示,man和woman主要的差异是gender(性别)上的差异,而king和queen之间的主要差异,根据向量的表示,也是gender(性别)上的差异,这就是为什么 e man − e woman e_{\text{man}}- e_{\text{woman}} eman−ewoman和 e king − e queen e_{\text{king}} - e_{\text{queen}} eking−equeen结果是相同的。这种类比推理的结论的方法就是,当算法被问及man对woman相当于king对什么时,算法所做的就是计算 e man − e woman e_{\text{man}}-e_{\text{woman}} eman−ewoman,然后找出一个向量使得 e man − e woman e_{\text{man}}-e_{\text{woman}} eman−ewoman≈ e king − e ? \ e_{\text{king}}- e_{?} eking−e?
为求这个单词,则需找w来最大化 e w e_{w} ew与 e king − e man + e woman e_{\text{king}} - e_{\text{man}} + e_{\text{woman}} eking−eman+ewoman的相似度,即
Find word w : a r g m a x S i m ( e w , e king − e man + e woman ) \text {Find\ word\ }w:argmax \ Sim(e_{w},e_{\text{king}} - e_{\text{man}} + e_{\text{woman}}) Find word w:argmax Sim(ew,eking−eman+ewoman)
相似度函数:余弦相似度中,在向量 u u u和 v v v之间定义相似度:
sim ( u , v ) = u T v ∣ ∣ u ∣ ∣ 2 ∣ ∣ v ∣ ∣ 2 \text{sim}\left( u,v \right) = \frac{u^{T}v}{\left| \left| u \right| \right|_{2}\left| \left| v \right| \right|_{2}} sim(u,v)=∣∣u∣∣2∣∣v∣∣2uTv
即 cos ( u , v ) \cos (u,v) cos(u,v),夹角为 0 0 0相似度最高,
距离:用平方距离或者欧氏距离来表示: ∣ ∣ u − v ∣ ∣ 2 \left| \left| u - v \right| \right|^{2} ∣∣u−v∣∣2,比起测量相似度,这个函数更容易测量的是相异度,所以我们需要对其取负,这个函数才能正常工作
只要你在大型的文本语料库上实现一个词嵌入学习算法,只要从足够大的语料库中进行学习,它就能自主地发现这些模式
5.2.4 嵌入矩阵(Embedding Matrix)
嵌入矩阵 E E E,维数为特征数 × \times ×词汇量,包含了每个词的每个特征
特征矩阵的提取: E × O word E \times O_{\text {word}} E×Oword,如:
KaTeX parse error: Unknown column alignment: * at position 24: …{\begin{array}{*̲{20}{c}} {0.…
假如说有某个单词w,那么 e w e_{w} ew就代表单词w的嵌入向量。同样, E O j EO_{j} EOj, O j O_{j} Oj就是只有第 j j j个位置是 1 1 1的one-hot向量,得到的结果就是 e j e_{j} ej,它表示的是字典中单词j的嵌入向量
实际操作时,会用特定函数实现而非矩阵乘法
5.2.5 学习词嵌入(Learning Word Embeddings)
一种算法:有一个固定的历史窗口,取单词前四个单词,综合这四个单词并预测下一个单词(可适应不定长输入)
得到的向量 e 4343 e_{4343} e4343等输入神经网络,通过softmax层输出,通过反向传播学习矩阵 E E E
其他上下文选择:
- 左边和右边的四个词(或其他数量)
- 目标词的前一个词
- 附近一个单词
5.2.6 Word2Vec
Skip-Gram模型:随机选一个词作为上下文词,然后随机在一定词距内选另一个词,比如在上下文词前后5个词内或者前后10个词内,来构造一个监督学习问题。
模型:
【image】
其中,softmax输出不同目标词的概率:
Softmax : p ( t | c ) = e θ t T e c ∑ j = 1 10 , 000 e θ j T e c \text{Softmax}:p\left( t \middle| c \right) = \frac{e^{\theta_{t}^{T}e_{c}}}{\sum_{j = 1}^{10,000}e^{\theta_{j}^{T}e_{c}}} Softmax:p(t∣c)=∑j=110,000eθjTeceθtTec
θ t \theta_{t} θt是一个与输出 t t t有关的参数,即某个词 t t t和标签相符的概率是多少。此处省略了softmax中的偏差项,想要加上的话也可以加上。
损失函数:
L ( y ^ , y ) = − ∑ i = 1 10 , 000 y i log y ^ i L\left( \hat y,y \right) = - \sum_{i = 1}^{10,000}{y_{i}\log \hat y_{i}} L(y^,y)=−i=1∑10,000yilogy^i
输出的 y ^ \hat y y^是一个从softmax单元输出的 10 , 000 10,000 10,000(总词汇数)维的向量,这个向量是所有可能目标词的概率
缺点:计算速度慢,需对所有元素求和
一些优化解决方案:如分级(hierarchical)的softmax分类器和负采样(Negative Sampling)
分级:类似二叉树,同时将常用词放上层,减少检索步数,每一个节点能判断该词在下一级哪个节点
采样:若平均随机采样,容易导致常用词频率太高,故采用不同的分级来平衡更常见的词和不那么常见的词
有两个不同版本的Word2Vec模型,另一个叫做CBOW,即连续词袋模型(Continuous Bag-Of-Words Model),它获得中间词两边的的上下文,然后用周围的词去预测中间的词,CBOW是从原始语句推测目标字词;而Skip-Gram正好相反,是从目标字词推测出原始语句。CBOW对小型数据库比较合适,而Skip-Gram在大型语料中表现更好。
5.2.7 负采样(Negative Sampling)
监督学习方案:给定一对单词,比如orange和juice,预测这是否是一对上下文词-目标词(context-target)。orange和juice就是个正样本,标记为 1 1 1,orange和king是负样本,标记为 0 0 0。
样本生成:先抽取一个上下文词,在一定词距内比如说正负 10 10 10个词距内选一个目标词,生成(context, word, target)
对,如(orange, juice, 1)。再从字典里随机抽取 K K K个词语并将target标记为0
选取 K K K:推荐小数据集 5 5 5到 20 20 20,大数据集 K K K小一点,对于更大的数据集 K K K就等于 2 2 2到 5 5 5
使用记号 c c c表示上下文词,记号 t t t表示可能的目标词,用 y y y表示 0 0 0和 1 1 1,则给定输入的 c c c, t t t对的条件下, y = 1 y=1 y=1的概率为:
P ( y = 1 | c , t ) = σ ( θ t T e c ) P\left( y = 1 \middle| c,t \right) = \sigma(\theta_{t}^{T}e_{c}) P(y=1∣c,t)=σ(θtTec)
网络模型:输入one-hot向量,再传递给 E E E,通过两者相乘获得嵌入向量 e 6257 e_{6257} e6257(例),你就得到了10,000个可能的逻辑回归分类问题每,个将会是用来判断目标词是否是某特定单词的分类器,每次只需训练这些特定单词的分类器(共 K + 1 K+1 K+1个),从而减少计算量
如何选取负样本: P ( w i ) = f ( w i ) 3 4 ∑ j = 1 10 , 000 f ( w j ) 3 4 P\left( w_{i} \right) = \frac{f\left( w_{i} \right)^{\frac{3}{4}}}{\sum_{j = 1}^{10,000}{f\left( w_{j} \right)^{\frac{3}{4}}}} P(wi)=∑j=110,000f(wj)43f(wi)43
f ( w i ) f(w_{i}) f(wi)是观测到的在语料库中的某个英文词的词频
5.2.8 GloVe 词向量(GloVe Word Vectors)
假定 X i j X_{{ij}} Xij是单词 i i i在单词 j j j上下文中出现的次数,根据上下文和目标词的定义,你大概会得出 X i j X_{{ij}} Xij等于 X j i X_{ji} Xji这个结论。但如果上下文总是目标词前一个单词的话,那么 X i j X_{{ij}} Xij和 X j i X_{ji} Xji就不会像这样对称了。我们可以定义上下文和目标词为任意两个位置相近的单词,假设是左右各10词的距离,那么 X i j X_{{ij}} Xij就是一个能够获取单词 i i i和单词 j j j出现位置相近时或是彼此接近的频率的计数器。
将他们之间的差距进行最小化处理:
minimize: ∑ i = 1 10 , 000 ∑ j = 1 10 , 000 f ( X i j ) ( θ i T e j + b i + b j ′ − l o g X i j ) 2 \text{minimize:}\sum_{i = 1}^{10,000}{\sum_{j = 1}^{10,000}{f\left( X_{{ij}} \right)\left( \theta_{i}^{T}e_{j} + b_{i} + b_{j}^{'} - logX_{{ij}} \right)^{2}}} minimize:i=1∑10,000j=1∑10,000f(Xij)(θiTej+bi+bj′−logXij)2
X i j X_{{ij}} Xij是等于 0 0 0的话,那么 l o g 0 log0 log0就是未定义的,因此添加一个额外的加权项 f ( X i j ) f\left(X_{{ij}}\right) f(Xij),如果 X i j X_{{ij}} Xij等于 0 0 0,则 0 log 0 = 0 0\log 0= 0 0log0=0
f ( X i j ) f\left(X_{{ij}}\right) f(Xij)的另一个作用是,像durion这样不常用的词,它也能给予大量有意义的运算,同时也能够给像this,is,of,a这样在英语里出现更频繁的词更大但不至于过分的权重。
一种训练算法的方法是一致地初始化 θ \theta θ和 e e e,然后使用梯度下降来最小化输出,当每个词都处理完之后取平均值,给定一个词 w w w,你就会有 e w ( f i n a l ) = e w + θ w 2 e_{w}^{(final)}= \frac{e_{w} +\theta_{w}}{2} ew(final)=2ew+θw。
5.2.9 情感分类(Sentiment Classification)
一种简单的方法:取输入词汇的特征向量取平均,再将平均后的向量输入到softmax单元
RNN方法(many to one):

找出每一个one-hot向量,这里我跳过去每一个one-hot向量的表示。用每一个one-hot向量乘以词嵌入矩阵 E E E,得到词嵌入表达 e e e,然后把它们送进RNN里
5.2.10 词嵌入除偏(Debiasing Word Embeddings)
现在机器学习和人工智能算法正渐渐地被信任用以辅助或是制定极其重要的决策,因此我们想尽可能地确保它们不受非预期形式偏见影响,比如说性别歧视、种族歧视等等
(略)
Week 3 序列模型和注意力机制(Sequence Models & Attention Mechanism)
5.3.1 基础模型(Basic Models)
编码网络:使用RNN、GRU或LSTM单元。输入序列逐步输入网络,最后输出一个向量表示整个输入序列。
解码网络:接收编码网络的输出向量,逐步生成翻译后的序列,直到生成结束标记。

用语言描述图像:使用CNN提取图像特征向量作为编码器的输入,RNN解码器生成描述序列。
5.3.2 选择最可能的句子(Picking the Most Likely Sentence)
条件语言模型:条件概率 P ( y ∣ x ) P(y|x) P(y∣x)表示给定输入 x x x生成输出 y y y的可能性。通过最大化这个概率来优化模型。
使用集束搜索避免贪心搜索的局限性,确保更全面地考虑可能的输出序列。

5.3.3 集束搜索(Beam Search)
集束搜索通过维护多个候选序列来寻找最优输出。参数B(集束宽)决定同时考虑的候选序列数量。
- 初始化:从起始标记开始,计算所有可能的第一个输出词的概率。
- 迭代:在每个步骤,扩展每个候选序列,选择概率最高的B个序列。
- 终止:当所有序列都达到结束标记或达到最大长度时停止。

5.3.4 注意力机制(Attention Mechanism)
注意力机制通过动态调整不同输入部分的权重,增强模型对重要信息的关注。
- 注意力权重计算:对编码器输出和解码器当前状态进行比较,通常使用点积或其他相似性度量。
- 上下文向量:使用注意力权重对编码器输出进行加权求和,生成上下文向量,并与解码器输入结合。
注意力机制有助于解决长序列依赖问题,使模型在生成每个输出时能够灵活地“关注”输入的不同部分。
更多推荐



所有评论(0)