深度学习入门 | Self-attentionRNNLSTM
文章目录
- 词汇转为向量,即Word Embedding
- cbow
- skip-gram
- 声音讯号转为向量
- Self-attention
- 提出背景
- Self-attention原理
- 计算相关性
- self-attention计算过程
- self-attention和CNN
- RNN
- RNN两种网络类型(Jordan network和Elman network)
- 双向神经网络(Bidirectional RNN)
- LSTM
- LSTM解决了RNN什么缺点
- 梯度爆炸的解决方案
- 梯度消失的解决方案
- LSTM常见面试题
- github项目
词汇转为向量,即Word Embedding
问题来了,如何把输入的词汇变成向量形式?这个把词汇转为向量的操作,我们就称为Word Embedding。事实上,可以有好几种,其中最简单的就是One-hot Encoding
- One-hot Encoding:例如把apple = [ 1 0 0 0 0 …… ];bag = [ 0 1 0 0 0 …… ];cat = [ 0 0 1 0 0 …… ],但词语之间的相关性会丢失。
- word2vec:这是通过神经网络的模型去得到的向量,下面介绍两个经典的word2vec的方式,分别是cbow和skip-gram,一个是利用上下文预测中心词,一个是利用中心词预测上下文。
cbow
假设语料库一共有V个词, 每个词在语料库中取其上下文中共C个词作为它的上下文。每个词最终使用N维的embedding来表达。
- 输入部分: 那么神经网络的输入就是这C个上下文的词,每个词简单的用one-hot representation. 设每个词的向量大小是1 * V. 所以输入一共是C* V向量
- 隐藏层:隐藏层大小为VN,于是 C * V个向量,与V * N的矩阵相乘,乘完之后把输出的向量大小为CN,对每列求平均即每个上下文词求平均, size是1 * N。这里的1 * N的向量我们就视为中心词的word-embedding
- NN的输出层:将隐层乘以一个N * V的矩阵产出一个1 * V的向量,并做softmax, 作为所有词的概率表示。
- 求LOSS:将上面的output与当前的目标词的one-hot representation求loss.
skip-gram
模型的结构如下:
- 输入层:目标词语基于词库做one-hot编码的词向量,size为1×N;
- 输入层→隐藏层:做线性变换的权重矩阵,size为 N × M,且 M < < N;
- 隐藏层:size为 1 × M的向量,即目标词语的词向量;
- 隐藏层→输出层:做线性变换的权重矩阵,size为 M × N ;
- 激活函数:采用了softmax函数;
- 输出层:目标词与词库中所有词是上下文关系的概率,size为 1 × N .
这里的输入为 1×N 的向量(即词库中词语总量为N),输入层到隐藏层的权重矩阵为 N×M(其中M<<N),隐藏层输出的 1×M 向量就是词语的embedding词向量,所以embedding向量其实是上述NN模型的“中间产物”。
声音讯号转为向量
Self-attention
针对输入的向量不是一个,而是一排,且输入向量个数会改变,比如说输入一句话,这句话有很多词汇,那么输入向量就是不确定长度的。
当然输出也有很多种类型,主要有以下几种:
输入和输出维度一致,即输入N维输出N维。应用场景如词性标注
输入多维,输出一维。应用场景如抓取一段文字,判断情绪是积极还是消极
输入多维,输出多维,称为seq2seq。应用场景如语言翻译
提出背景
我们下面比较关注的是第一种,也就是输入N维输出N维,每个词语都输出一个label。因为词语之间是有联系的,我们希望能学习到多个词语,最简单的想法就是搞个window,对于某个词把其相邻window个的一起词放进fully-connect输出一个Window,但是我们输入的词语序列长度是不固定的,没法确定window的大小是多少比较合适。于是,我们需要提出新的模型,即Self-attention
Self-attention原理
Self-attention是考虑一整个序列后才得到输出的,可以进行多次Self-attention操作,例如下图输入序列后,进行self-attention学习一整个序列信息后输出到fully-connect层,然后你可以再使用self-attention把这个序列信息再处理一次,然后交替使用self-attention和fully-connect,最后输出label。
下面,我们来看具体的self-attention长什么样子。
刚才分析过,我们可以做多层self-attention,因此其输入不一定是原始序列,可能是处理过后的隐藏层输出,所以我们把输入用αi\alpha_iαi表示而不是xix_ixi。而self-attention考虑整个序列的信息最后才输出label的,那么如何考虑整个序列信息呢?以生成b1b_1b1举例,这里就需要我们分析整个序列中每个元素与α1\alpha_1α1的相关性。
计算相关性
简单的介绍下以下两种,我们用的是左边比较简单的那种。
左边算法,对于输入的两个数据α1,α2\alpha_1,\alpha_2α1,α2,我们分别乘上矩阵WqW_qWq和WkW_kWk,得到新的向量qqq和kkk,qqq和kkk的点乘(内积)就是所求的相关性。
而右边是qqq和kkk相加后做tanh,再与矩阵W相乘后得到相关性
self-attention计算过程
我们假设输入的向量只有α1,α2...,α4\alpha_{1},\alpha_{2}...,\alpha_{4}α1,α2...,α4共四个。
计算b1b_1b1主要分为两部分,一是计算 α1,α2...,α4\alpha_{1},\alpha_{2}...,\alpha_{4}α1,α2...,α4与 α1\alpha_{1}α1的相关性,如α12\alpha_{12}α12,再将这个相关性进行soft-max处理得到α12′\alpha'_{12}α12′。二是将每个输入向量乘viv_ivi再与将soft-max处理后的α12′\alpha'_{12}α12′相乘,这些求和之后得到的就是b1b_1b1。具体过程如下图所示。
用矩阵表示如下
self-attention和CNN
cnn是self-attention的特殊化,通过设置self-attention可以做到cnn的所有工作。
self-attention是关注全局的关系,cnn是关注指定范围内互相的关系。
RNN
举例,我们输入的x是[[1,1],[1,1],[2,2]],初始W=[0,0],U,W都是线性相加,即U,W=[[1,1],[1,1]],如果x1=[x11,x12]x_1=[x_{11},x_{12}]x1=[x11,x12],经过U之后是变成[x11+x12,x11+x12][x_{11}+x_{12},x_{11}+x_{12}][x11+x12,x11+x12]
输入x1=[1,1]x_1=[1,1]x1=[1,1]时,经过U变成[2,2],加上W=[0,0],把[2,2]存储到W中去;下一个输入x2=[1,1]x_2=[1,1]x2=[1,1]时,经过U变成[2,2],加上W=[2,2],得到的S为[3,3],把[3,3]存储到W中去以此类推
注意的是,每次新的输入进去,经过U作用得到的值加入到W时,将原本W中有的值覆盖掉了。因此RNN是短记忆性,接下来我们介绍具有长记忆性的RNN,成为LSTM
RNN两种网络类型(Jordan network和Elman network)
https://blog.csdn.net/qq_31375855/article/details/106795105
递归神经网络有两种类型:Jordan network和Elman network,现在常用的RNN(包括LSTM、GRU等等)都是用Elman network。
它们都是很久以前的奠基性工作了,所以都是基于最浅的三层网络结构定义的。
它们的区别是:
Elman network的一个recurrent层的输出经过时延后作为下一时刻这一层的输入的一部分,然后recurrent层的输出同时送到网络后续的层,比如最终的输入层。
而Jordan network则直接把整个网络最终的输出(i.e. 输出层的输出)经过时延后反馈回网络的输入层
双向神经网络(Bidirectional RNN)
分别正向和反向遍历,共同输出的再进行一次遍历。优点在于产生output的时候,普通的RNN给定当前词他可能仅仅看了过去的内容,而双向RNN不仅看了前面的还看了后面的内容。
LSTM
长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。
我们举例说明,输入向量是[[3,1,0],[4,1,0]…]如右下角所示,分别控制存储、记忆和释放的向量,即上图中的zi,zf,zoz_i,z_f,z_ozi,zf,zo,向量值是[0,100,0,-1],[0,100,0,10],[0,100,0,-10]。
首先,输入x1=[3,1,0]x_1=[3,1,0]x1=[3,1,0],经过g(z)g(z)g(z)操作得到(1∗3+0∗1+0∗0)+0∗1=3(1*3+0*1+0*0)+0*1=3(1∗3+0∗1+0∗0)+0∗1=3,x1x_1x1和ziz_izi向量相乘得到(0∗3+100∗1+0∗0)−10=90(0*3+100*1+0*0)-10=90(0∗3+100∗1+0∗0)−10=90,经过soft-max返回概率趋近于1,说明存储开关开放,我们把值3存入cell中。再看记忆开关,x1x_1x1和zfz_fzf向量相乘得到(0∗3+100∗1+0∗0)+10=110(0*3+100*1+0*0)+10=110(0∗3+100∗1+0∗0)+10=110,经过soft-max返回概率趋近于1,说明记忆开关开放,我们把值cell中的3*1=3。最后看释放开关,x1x_1x1和zoz_ozo向量相乘得到(0∗3+0∗1+100∗0)−10=−10(0*3+0*1+100*0)-10=-10(0∗3+0∗1+100∗0)−10=−10,经过soft-max返回概率趋近于0,说明释放开关关闭,我们把值cell中3无法释放出去,所以y1=0y_1=0y1=0。
同理,输入x2=[4,1,0]x_2=[4,1,0]x2=[4,1,0],经过g(z)g(z)g(z)操作得到4,存储开关开启,记忆开关开启,因此此时cell中值Wie3+4=7,释放开关关闭,所以y2=0y_2=0y2=0。
接着,输入x3=[2,0,0]x_3=[2,0,0]x3=[2,0,0],经过g(z)g(z)g(z)操作得到2,存储开关关闭,记忆开关关闭,此时cell中值还是7,释放开关关闭,所以y3=0y_3=0y3=0。
接着,输入x4=[1,0,−1]x_4=[1,0,-1]x4=[1,0,−1],经过g(z)g(z)g(z)操作得到1,存储开关关闭,记忆开关关闭,此时cell中值还是7,但是释放开关开放,所以y4=7y_4=7y4=7。
LSTM解决了RNN什么缺点
参考: https://blog.csdn.net/u012744245/article/details/112378232(RNN的梯度消失和梯度爆炸)
https://blog.csdn.net/XiaoYi_Eric/article/details/105751692
RNN很容易出现梯度消失或爆炸的问题,梯度消失和梯度爆炸本质是同一种情况。梯度消失经常出现的原因:一是使用深层网络;二是采用不合适的损失函数,如Sigmoid。梯度爆炸一般出现的场景:一是深层网络;二是权值初始化太大。
深层网络由许多非线性层堆叠而来,每一层网络激活后的输出为 fi(x)f i ( x )fi(x) ,其中 i 为第 i层, x 是第 i层的输入,即第 i − 1层的输出, f 是激活函数,整个深层网络可视为一个复合的非线性多元函数:fn(...f2(f1(x))))f_n(...f_2(f_1(x))))fn(...f2(f1(x))))。
我们在RNN中使用的激活函数是sigmod函数,而sigmod函数在求导时有个很严重的问题,就是导数值最大是0.25,假设s是sigmod函数,则s′=s(1−s)≤0.25s'=s(1-s)\leq 0.25s′=s(1−s)≤0.25,反向传播随着层数增加,梯度更新将以指数形式衰减,即发生梯度消失。反之如果我们求导大于1就会发生梯度爆炸。
需要注意的是,RNN和DNN梯度消失和梯度爆炸含义并不相同。RNN中权重在各时间步内共享,最终的梯度是各个时间步的梯度和。因此,RNN中总的梯度是不会消失的,即使梯度越传越弱,也只是远距离的梯度消失。 RNN所谓梯度消失的真正含义是,梯度被近距离梯度主导,远距离梯度很小,导致模型难以学到远距离的信息。 明白了RNN梯度消失的原因之后,我们看LSTM如何解决问题的呢?
我们采用LSTM就可以避免者消失,主要原因在于LSTM内部复杂的“门”(gates),RNN每次的记忆都会被最新的输入覆盖掉,而LSTM通过它内部的“门”可以在更新的时候“记住”前几次训练的“残留记忆”,也就是说LSTM会存储过往的以及来消除近距离梯度的影响。但是LSTM没办法很好的解决梯度爆炸的问题,所以我们在训练LSTM的时候,往往把learning rate设小一些。
梯度爆炸的解决方案
https://blog.csdn.net/u012744245/article/details/112378232(RNN的梯度消失和梯度爆炸)
- 梯度裁剪:主要思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
- 权值正则化(weithts regularization):正则化是通过对网络权重做正则限制过拟合,如下正则项在损失函数中的形式:
梯度消失的解决方案
选择relu、leakrelu、elu等激活函数
使用Batchnorm(batch normalization,简称BN)
残差结构
LSTM常见面试题
https://blog.csdn.net/qq_38147421/article/details/107692418
github项目
https://github.com/vsmolyakov/experiments_with_python
深度学习入门 | Self-attentionRNNLSTM相关推荐
- 【AI参赛经验】深度学习入门指南:从零开始TinyMind汉字书法识别——by:Link
各位人工智能爱好者,大家好! 由TinyMind发起的#第一届汉字书法识别挑战赛#正在火热进行中,比赛才开始3周,已有数只黑马冲进榜单.目前TOP54全部为90分以上!可谓竞争激烈,高手如林.不是比赛 ...
- 深度学习入门,一文讲解神经网络的构成、训练和算法
小白深度学习入门系列 神经网络的构成.训练和算法 什么是神经网络 人工神经网络(Artificial Neural Network,ANN),简称神经网络(Neural Network,NN),是一种 ...
- PyTorch深度学习入门与实战(案例视频精讲)
作者:孙玉林,余本国 著 出版社:中国水利水电出版社 品牌:智博尚书 出版时间:2020-07-01 PyTorch深度学习入门与实战(案例视频精讲)
- PyTorch深度学习入门
作者:曾芃壹 出版社:人民邮电出版社 品牌:iTuring 出版时间:2019-09-01 PyTorch深度学习入门
- 深度学习入门 基于Python的理论与实现
作者:斋藤康毅 出版社:人民邮电出版社 品牌:iTuring 出版时间:2018-07-01 深度学习入门 基于Python的理论与实现
- 干货|《深度学习入门之Pytorch》资料下载
深度学习如今已经成为了科技领域中炙手可热的技术,而很多机器学习框架也成为了研究者和业界开发者的新宠,从早期的学术框架Caffe.Theano到如今的Pytorch.TensorFlow,但是当时间线来 ...
- 福利丨一门面向所有人的人工智能公开课:MIT 6.S191,深度学习入门
对初学者来说,有没有易于上手,使用流行神经网络框架进行教学的深度学习课程?近日,麻省理工学院(MIT)正式开源了在线介绍性课程「MIT 6.S191:深度学习入门」.该课程包括一系列有关神经网络及其在 ...
- 深度学习入门指北——从硬件到软件
作者:隔壁王大喵 近日,Rachel Thomas在fast.ai上发布了一篇博文<What you need to do deep learning>,他希望通过这篇文章回答一些深度学习 ...
- LeCun亲授的深度学习入门课:从飞行器的发明到卷积神经网络
Root 编译整理 量子位 出品 | 公众号 QbitAI 深度学习和人脑有什么关系?计算机是如何识别各种物体的?我们怎样构建人工大脑? 这是深度学习入门者绕不过的几个问题.很幸运,这里有位大牛很乐意 ...
- BP算法双向传_链式求导最缠绵(深度学习入门系列之八)
摘要: 说到BP(Back Propagation)算法,人们通常强调的是反向传播,其实它是一个双向算法:正向传播输入信号,反向传播误差信息.接下来,你将看到的,可能是史上最为通俗易懂的BP图文讲解, ...
最新文章
- AcWing 397. 逃不掉的路(边双连通分量缩点成树 + 树链剖分乱搞)
- Java程序员必须了解的JVM性能调优知识,全都在这里了
- 团队-象棋游戏-模块测试过程
- php vo,$vo.id php
- HttpRequest 与HttpWebRequest 有什么区别
- 美国康普SYSTIMAX iPatch智能配线系统介绍
- c++版 mulSpectrums
- Django 学习笔记之七 实现分页
- 通过History Trends Unlimited通过统计服务器上Chrome浏览器Top10网页历史访问量(2021.11.23)
- [原创] PHP 使用Redis实现锁
- MFC Attach()函数和Detach()函数
- 教主们:虽然这道题我不会,但Ac还是没问题的。
- 大数据分析必须要会的数据处理技巧!!!
- 面向对象六大原则详解
- html盒子阴影效果,CSS3给div或者文字添加阴影(盒子阴影、文本阴影的使用)
- 编程范式之栈的抽象操作
- ajax嵌套ajax的坏处,promise解决ajax的多重嵌套
- Python描述性统计
- 关于数据分析用到的统计学知识
- 5.被动回复用户消息
热门文章
- 北航周号益:从“鹦鹉”到“乌鸦”,AI的本质是探索通用智能的可能性
- SpringCloud五大神兽之Eureka服务注册(一)
- 设置textview字体样式
- matlab中的covsfa什么意思,MALSAR1.1 多种多任务学习算法的工具箱 有代码有使 册 matlab版 238万源代码下载- www.pudn.com...
- 对于数据挖掘的几点认识[转]
- 程序员漫画集连载[1]
- 机器人来了!日本保险巨头启用AI替换30%理赔部员工
- 一个Bug案例的解决过程:连续输入错误的PIN码,不能实现第二次倒计时30s才能重试
- 从流水线角度看MIPS处理器ISA的实现逻辑以及RTOS操作系统仿真
- 部署dashboard