黄骅市企业名录,赣州seo培训,wordpress购物车功能,网站建设难吗文章目录1 循环神经网络1.1 场景与多种应用1.2 RNN网络结构1.2.1为什么需要RNN1.2.2 RNN 结构1.3 多种RNN1.4 BPTT算法1.5 生成模型与图像描述2 LSTM2.1 LSTM2.2 GRU1 循环神经网络
1.1 场景与多种应用
1 模仿论文生成 2 模仿linux内核编写代码 3 模仿小四写论文 4 机器翻译 …
文章目录1 循环神经网络1.1 场景与多种应用1.2 RNN网络结构1.2.1为什么需要RNN1.2.2 RNN 结构1.3 多种RNN1.4 BPTT算法1.5 生成模型与图像描述2 LSTM2.1 LSTM2.2 GRU1 循环神经网络
1.1 场景与多种应用
1 模仿论文生成 2 模仿linux内核编写代码 3 模仿小四写论文 4 机器翻译 5 image to text 看图说话
1.2 RNN网络结构
1.2.1为什么需要RNN
传统神经网络输入和输出是互相独立的。 我是中国人我的母语是____。这里完形填空的结果是与前面的词相关的。 RNN引入 记忆 的概念。循环来源于每个元素执行相同的任务。输出依赖于 输入和记忆。
有时间 顺序上的依赖都可以使用RNN。例如一段时间内的销量。也就是说RNN不仅仅可以用于解决NLP问题。
推荐系统下也可以使用RNN。
1.2.2 RNN 结构 xtx_txt是时间t处的输入。例如时间t的词向量。 sts_tst是时间t处的记忆。 oto_tot是时间t处的输出。例如预测下个词的话可能是每个词出现的概率。 公式 Stf(UXtWSt−1)S_tf(UX_tWS_{t-1})Stf(UXtWSt−1) f可以是tanh等函数。 Otsoftmax(VSt)O_tsoftmax(VS_t)Otsoftmax(VSt) 例如XtX_tXt可以是一个1000x1的向量U是一个800x1000的矩阵W是一个800x800的矩阵这样StS_tSt就是一个800x1的向量。 V是一个4万x800的矩阵。4万是词汇量
说明 1 隐状态sts_tst是记忆体捕捉了之前时间点上的信息。例如现在你读高三sts_tst就是你在高一高二高三学习内容的记忆。
2 oto_tot是通过之前所有时间以及当前记忆共同得到的。
3 由于容量问题sts_tst并不能记住所有内容。
4 RNN共享一组参数U、W、V。可以这样理解你就是你你用同一套学习方法学习了高一、高二、高三的内容。
5 有些情况下不需要每个时间都有oto_tot只需要在最后时间有输出即可。例如文本分类。
RNN唐诗生成器
1.3 多种RNN
1 双向RNN 有些时候输出依赖于之前和之后的序列元素。
h⃗tf(W⃗xtV⃗h⃗t−1b⃗)\vec h_t f(\vec Wx_t\vec V\vec h_{t-1}\vec b)htf(WxtVht−1b) h←tf(W←xtV←h←t1b←)\overleftarrow{h}_{t}f\left(\overleftarrow{W} x_{t}\overleftarrow{V} \overleftarrow{h}_{t1}\overleftarrow{b}\right)htf(WxtVht1b) ytg(U[h⃗t;h←t]c)y_{t}g\left(U\left[\vec{h}_{t} ; \overleftarrow{h}_t\right]c\right)ytg(U[ht;ht]c)
从左向右计算记忆h⃗t\vec h_tht从右向左计算记忆h←t\overleftarrow{h}_thtU[h⃗t;h←t]U\left[\vec{h}_{t} ; \overleftarrow{h}_t\right]U[ht;ht]是对两个矩阵做拼接。
h和s的含义相同表示记忆。 左右信息融合使用的是concat拼接的方法。
2 深层双向RNN 图中的h和之前的S是等价的。 这样的网络可以这样理解。高考前的多轮复习。高三内容有很多章每个时间t学习一章。复习呢进行了多轮。按照图中是三轮。
h⃗t(i)f(W⃗(i)ht(i−1)V⃗(i)h⃗t−1(i)b⃗(i))\vec h_t^{(i)} f(\vec W^{(i)}h_t^{(i-1)}\vec V^{(i)}\vec h_{t-1}^{(i)}\vec b^{(i)})ht(i)f(W(i)ht(i−1)V(i)ht−1(i)b(i)) t第二章i第二轮那么其学习记忆W第一轮第二章的学习记忆V第二轮第一章的学习记忆。
1.4 BPTT算法
BPTT和BP很类似是一个思路但是因为这里和时刻有关系。 在这样一个多分类器中损失函数是一个交叉熵。 某一时刻的损失函数是Et(yt,y^t)−ytlogy^tE_{t}\left(y_{t}, \hat{y}_{t}\right)-y_{t} \log \hat{y}_{t}Et(yt,y^t)−ytlogy^t 最终的损失函数是所有时刻的交叉熵相加E(y,y^)∑tEt(yt,y^t)−∑ytlogy^t\begin{aligned} E(y, \hat{y}) \sum_{t} E_{t}\left(y_{t}, \hat{y}_{t}\right) \\ -\sum y_{t} \log \hat{y}_{t} \end{aligned}E(y,y^)t∑Et(yt,y^t)−∑ytlogy^t 损失函数对W求偏导∂E∂W∑t∂Et∂W\frac{\partial E}{\partial W}\sum_{t} \frac{\partial E_{t}}{\partial W}∂W∂E∑t∂W∂Et
假设t3∂E3∂W∂E3∂y^3∂y^3∂s3∂s3∂W\frac{\partial E_{3}}{\partial W}\frac{\partial E_{3}}{\partial \hat{y}_{3}} \frac{\partial \hat{y}_{3}}{\partial s_{3}} \frac{\partial s_{3}}{\partial W}∂W∂E3∂y^3∂E3∂s3∂y^3∂W∂s3 E3E_3E3和y3y_3y3有关系y3y_3y3和s3s_3s3有关系参考2.1中的公式。 而s3tanh(Ux3Ws2)s_3tanh(Ux_3Ws_2)s3tanh(Ux3Ws2)s3s_3s3和s2s_2s2有关系我们对s3s_3s3对W求偏导不能直接等于s2s_2s2因为s2s_2s2也和W有关系。 s2tanh(Ux2Ws1)s_2tanh(Ux_2Ws_1)s2tanh(Ux2Ws1)
s2s_2s2和s1s_1s1有关系…一直到0时刻。所以我们会把每个时刻的相关梯度值相加∂s3∂W∑k03∂s3∂sk∂sk∂W\frac{\partial s_{3}}{\partial W}\sum_{k0}^{3} \frac{\partial s_{3}}{\partial s_{k}} \frac{\partial s_{k}}{\partial W}∂W∂s3k0∑3∂sk∂s3∂W∂sk
其中我们在计算∂s3∂s2\dfrac{\partial s_3}{\partial s_2}∂s2∂s3的时候需要使用链式法则计算∂s3∂s1∂s3∂s2∂s2∂s1∂s1∂s0\dfrac{\partial s_3}{\partial s_1}\dfrac{\partial s_3}{\partial s_2}\dfrac{\partial s_2}{\partial s_1}\dfrac{\partial s_1}{\partial s_0}∂s1∂s3∂s2∂s3∂s1∂s2∂s0∂s1
所以最终得到∂E3∂W∑k03∂E3∂y^3∂y^3∂s3∂s3∂sk∂sk∂W∑k03∂E3∂y^3∂y^3∂s3(∏jk13∂sj∂sj−1)∂sk∂W\frac{\partial E_{3}}{\partial W}\sum_{k0}^{3} \frac{\partial E_{3}}{\partial \hat{y}_{3}} \frac{\partial \hat{y}_{3}}{\partial s_{3}} \frac{\partial s_{3}}{\partial s_{k}} \frac{\partial s_{k}}{\partial W} \sum_{k0}^{3} \frac{\partial E_{3}}{\partial \hat{y}_{3}} \frac{\partial \hat{y}_{3}}{\partial s_{3}}\left(\prod_{jk1}^{3} \frac{\partial s_{j}}{\partial s_{j-1}}\right) \frac{\partial s_{k}}{\partial W}∂W∂E3k0∑3∂y^3∂E3∂s3∂y^3∂sk∂s3∂W∂skk0∑3∂y^3∂E3∂s3∂y^3⎝⎛jk1∏3∂sj−1∂sj⎠⎞∂W∂sk
看公式中有连乘的部分。当使用tanh作为激活函数的时候由于导数值分别在0到1之间随着时间的累计小于1的数不断相城很容易趋近于0。(另外一种解释如果权重矩阵 W的范数也不很大那么经过 − 次传播后∂s3∂sk\dfrac{\partial s_3}{\partial s_k}∂sk∂s3的范数会趋近于0这也就导致了梯度消失。)
梯度消失带来的一个问题就是记忆力有限离得越远的东西记住得越少。
1.5 生成模型与图像描述
一张图片-经过VGG网络取得倒数第一层的输出-作为RNN第一层的多加的输入。
2 LSTM
2.1 LSTM
LSTM就是为了解决普通RNN中的梯度消失问题提出的。 LSTM提出了记忆细胞C以及各种门。下图中的h与上面的S是相同含义表示记忆。每个时刻的输出在这里是没有画出来的。 假设现在有一个任务是根据已经读到的词预测下一个词。例如输入法生成诗词。 第1步忘记门从记忆细胞中丢弃一些信息
使用sigmoid函数经过sigmoid之后得到一个概率值描述每个部分有多少量可以通过。 ftσ(Wf⋅[ht−1,xt]bf)f_{t}\sigma\left(W_{f} \cdot\left[h_{t-1}, x_{t}\right]b_{f}\right)ftσ(Wf⋅[ht−1,xt]bf)
如果C中包含当前对象的性别属性现在已经正确的预测了当前的名词。当我们看到另外一个新的对象的时候我们希望忘记旧对象的性别属性。
第2步更新什么新信息到记忆中
sigmoid决定什么值需要更新: itσ(Wi⋅[ht−1,xt]bi)i_{t}\sigma\left(W_{i} \cdot\left[h_{t-1}, x_{t}\right]b_{i}\right)itσ(Wi⋅[ht−1,xt]bi) tanh层创建一个新的候选值向量高三这一年学到的所有知识 C~ttanh(WC⋅[ht−1,xt]bC)\tilde{C}_{t}\tanh \left(W_{C} \cdot\left[h_{t-1}, x_{t}\right]b_{C}\right)C~ttanh(WC⋅[ht−1,xt]bC)
第3步更新记忆细胞
把旧状态与ftf_tft相乘丢弃掉我们确定需要丢弃的信息 加上iti_tit*C~t\tilde{C}_{t}C~t,就是新的候选值更新状态。 Ctft∗Ct−1it∗C~tC_{t}f_{t} * C_{t-1}i_{t} * \tilde{C}_{t}Ctft∗Ct−1it∗C~t Ct−1C_{t-1}Ct−1是到高二以及之前的所有记忆C~t\tilde{C}_{t}C~t高三这一年学到的所有知识。带着两部分应该留下的内容去高考。
在任务中就是希望把新看到对象的性别属性添加到C而把旧对象的性别属性删除。
第4步基于细胞状态得到输出
首先一个sigmoid层确定细胞状态的哪个部分的值将输出otσ(Wo[ht−1,xt]bo)o_{t}\sigma\left(W_{o}\left[h_{t-1}, x_{t}\right]b_{o}\right)otσ(Wo[ht−1,xt]bo)
接着用tanh处理细胞状态输出我们确定输出的那部分这部分是记忆用于下一时刻帮助做出决策的htot∗tanh(Ct)h_{t}o_{t} * \tanh \left(C_{t}\right)htot∗tanh(Ct)
在语言模型中既然我当前看到了一个对象这里可能输出一个动词信息以备下一步需要用到。例如这里可能输出当前对象是单数还是复数这样就知道下一个动词应该填写什么形式。
总结
1决定老细胞只留下哪部分ftσ(Wf⋅[ht−1,xt]bf)f_{t}\sigma\left(W_{f} \cdot\left[h_{t-1}, x_{t}\right]b_{f}\right)ftσ(Wf⋅[ht−1,xt]bf) 2: 决定新知识应该记住哪部分:itσ(Wi⋅[ht−1,xt]bi)i_{t}\sigma\left(W_{i} \cdot\left[h_{t-1}, x_{t}\right]b_{i}\right)itσ(Wi⋅[ht−1,xt]bi) 新学习到的知识C~ttanh(WC⋅[ht−1,xt]bC)\tilde{C}_{t}\tanh \left(W_{C} \cdot\left[h_{t-1}, x_{t}\right]b_{C}\right)C~ttanh(WC⋅[ht−1,xt]bC) 3 更新细胞状态Ctft∗Ct−1it∗C~tC_{t}f_{t} * C_{t-1}i_{t} * \tilde{C}_{t}Ctft∗Ct−1it∗C~t 4 决定要输出哪部分otσ(Wo[ht−1,xt]bo)o_{t}\sigma\left(W_{o}\left[h_{t-1}, x_{t}\right]b_{o}\right)otσ(Wo[ht−1,xt]bo) 产生隐藏状态的输出htot∗tanh(Ct)h_{t}o_{t} * \tanh \left(C_{t}\right)htot∗tanh(Ct)
对比普通的RNN输出otσ(VSt)o_t\sigma\left(VS_t\right)otσ(VSt),Sttanh(UxtWSt−1)S_ttanh(Ux_tWS_{t-1})Sttanh(UxtWSt−1)对于记忆StS_tSt是由之前记忆和新知识共同组成。加入细胞状态可以选择忘记一部分老知识和选择忘记一部分新知识。
在之前的求导过程中∂s3∂s1∂s3∂s2∂s2∂s1∂s1∂s0\dfrac{\partial s_3}{\partial s_1}\dfrac{\partial s_3}{\partial s_2}\dfrac{\partial s_2}{\partial s_1}\dfrac{\partial s_1}{\partial s_0}∂s1∂s3∂s2∂s3∂s1∂s2∂s0∂s1现在变为。。。。。
输出otσ(Vht)o_t\sigma\left(Vh_t\right)otσ(Vht) htot∗tanh(Ct)h_{t}o_{t} * \tanh \left(C_{t}\right)htot∗tanh(Ct) Ctft∗Ct−1it∗C~tft∗Ct−1it∗tanh(WC⋅[ht−1,xt]bC)C_{t}f_{t} * C_{t-1}i_{t} * \tilde{C}_{t}f_{t} * C_{t-1}i_t*\tanh \left(W_{C} \cdot\left[h_{t-1}, x_{t}\right]b_{C}\right)Ctft∗Ct−1it∗C~tft∗Ct−1it∗tanh(WC⋅[ht−1,xt]bC) 损失函数不变还是令t3∂E3∂W∂E3∂y^3∂y^3∂h3∂h3∂C3∂C3∂Wc\frac{\partial E_{3}}{\partial W}\frac{\partial E_{3}}{\partial \hat{y}_{3}} \frac{\partial \hat{y}_{3}}{\partial h_{3}} \frac{\partial h_{3}}{\partial C_3}\frac{\partial C_{3}}{\partial W_c}∂W∂E3∂y^3∂E3∂h3∂y^3∂C3∂h3∂Wc∂C3
要求∂C3∂Wc\dfrac{\partial C_3}{\partial W_c}∂Wc∂C3这样CtC_tCt与WcW_cWc有关系Ct−1C_{t-1}Ct−1与WcW_cWc有关系两部分相加对整个函数求导就是对这两部分分别求导再相加。与普通RNN的相乘 ∂C3∂C1∂C3∂C2∂C2∂C1?\dfrac{\partial C_3}{\partial C_1}\dfrac{\partial C_3}{\partial C_2}\dfrac{\partial C_2}{\partial C_1}?∂C1∂C3∂C2∂C3∂C1∂C2?
2.2 GRU
GRU是LSTM的变种之一。
GRU做的改变是 1 将忘记门和输入门合并成一个门称为更新门。 2 细胞状态和隐藏状态也就是上面的C和hth_tht合并为一个hth_tht。 这样GRU的参数就比标准LSTM要少在很多情况下效果基本一致。