文章目录

  • 词汇转为向量,即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

  1. One-hot Encoding:例如把apple = [ 1 0 0 0 0 …… ];bag = [ 0 1 0 0 0 …… ];cat = [ 0 0 1 0 0 …… ],但词语之间的相关性会丢失。
  2. 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

针对输入的向量不是一个,而是一排,且输入向量个数会改变,比如说输入一句话,这句话有很多词汇,那么输入向量就是不确定长度的。

当然输出也有很多种类型,主要有以下几种:

  1. 输入和输出维度一致,即输入N维输出N维。应用场景如词性标注

  2. 输入多维,输出一维。应用场景如抓取一段文字,判断情绪是积极还是消极

  3. 输入多维,输出多维,称为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_qWqWkW_kWk,得到新的向量qqqkkkqqqkkk的点乘(内积)就是所求的相关性。

而右边是qqqkkk相加后做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(13+01+00)+01=3x1x_1x1ziz_izi向量相乘得到(0∗3+100∗1+0∗0)−10=90(0*3+100*1+0*0)-10=90(03+1001+00)10=90,经过soft-max返回概率趋近于1,说明存储开关开放,我们把值3存入cell中。再看记忆开关,x1x_1x1zfz_fzf向量相乘得到(0∗3+100∗1+0∗0)+10=110(0*3+100*1+0*0)+10=110(03+1001+00)+10=110,经过soft-max返回概率趋近于1,说明记忆开关开放,我们把值cell中的3*1=3。最后看释放开关,x1x_1x1zoz_ozo向量相乘得到(0∗3+0∗1+100∗0)−10=−10(0*3+0*1+100*0)-10=-10(03+01+1000)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(1s)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相关推荐

  1. 【AI参赛经验】深度学习入门指南:从零开始TinyMind汉字书法识别——by:Link

    各位人工智能爱好者,大家好! 由TinyMind发起的#第一届汉字书法识别挑战赛#正在火热进行中,比赛才开始3周,已有数只黑马冲进榜单.目前TOP54全部为90分以上!可谓竞争激烈,高手如林.不是比赛 ...

  2. 深度学习入门,一文讲解神经网络的构成、训练和算法

    小白深度学习入门系列 神经网络的构成.训练和算法 什么是神经网络 人工神经网络(Artificial Neural Network,ANN),简称神经网络(Neural Network,NN),是一种 ...

  3. PyTorch深度学习入门与实战(案例视频精讲)

    作者:孙玉林,余本国 著 出版社:中国水利水电出版社 品牌:智博尚书 出版时间:2020-07-01 PyTorch深度学习入门与实战(案例视频精讲)

  4. PyTorch深度学习入门

    作者:曾芃壹 出版社:人民邮电出版社 品牌:iTuring 出版时间:2019-09-01 PyTorch深度学习入门

  5. 深度学习入门 基于Python的理论与实现

    作者:斋藤康毅 出版社:人民邮电出版社 品牌:iTuring 出版时间:2018-07-01 深度学习入门 基于Python的理论与实现

  6. 干货|《深度学习入门之Pytorch》资料下载

    深度学习如今已经成为了科技领域中炙手可热的技术,而很多机器学习框架也成为了研究者和业界开发者的新宠,从早期的学术框架Caffe.Theano到如今的Pytorch.TensorFlow,但是当时间线来 ...

  7. 福利丨一门面向所有人的人工智能公开课:MIT 6.S191,深度学习入门

    对初学者来说,有没有易于上手,使用流行神经网络框架进行教学的深度学习课程?近日,麻省理工学院(MIT)正式开源了在线介绍性课程「MIT 6.S191:深度学习入门」.该课程包括一系列有关神经网络及其在 ...

  8. 深度学习入门指北——从硬件到软件

    作者:隔壁王大喵 近日,Rachel Thomas在fast.ai上发布了一篇博文<What you need to do deep learning>,他希望通过这篇文章回答一些深度学习 ...

  9. LeCun亲授的深度学习入门课:从飞行器的发明到卷积神经网络

    Root 编译整理 量子位 出品 | 公众号 QbitAI 深度学习和人脑有什么关系?计算机是如何识别各种物体的?我们怎样构建人工大脑? 这是深度学习入门者绕不过的几个问题.很幸运,这里有位大牛很乐意 ...

  10. BP算法双向传_链式求导最缠绵(深度学习入门系列之八)

    摘要: 说到BP(Back Propagation)算法,人们通常强调的是反向传播,其实它是一个双向算法:正向传播输入信号,反向传播误差信息.接下来,你将看到的,可能是史上最为通俗易懂的BP图文讲解, ...

最新文章

  1. AcWing 397. 逃不掉的路(边双连通分量缩点成树 + 树链剖分乱搞)
  2. Java程序员必须了解的JVM性能调优知识,全都在这里了
  3. 团队-象棋游戏-模块测试过程
  4. php vo,$vo.id php
  5. HttpRequest 与HttpWebRequest 有什么区别
  6. 美国康普SYSTIMAX iPatch智能配线系统介绍
  7. c++版 mulSpectrums
  8. Django 学习笔记之七 实现分页
  9. 通过History Trends Unlimited通过统计服务器上Chrome浏览器Top10网页历史访问量(2021.11.23)
  10. [原创] PHP 使用Redis实现锁
  11. MFC Attach()函数和Detach()函数
  12. 教主们:虽然这道题我不会,但Ac还是没问题的。
  13. 大数据分析必须要会的数据处理技巧!!!
  14. 面向对象六大原则详解
  15. html盒子阴影效果,CSS3给div或者文字添加阴影(盒子阴影、文本阴影的使用)
  16. 编程范式之栈的抽象操作
  17. ajax嵌套ajax的坏处,promise解决ajax的多重嵌套
  18. Python描述性统计
  19. 关于数据分析用到的统计学知识
  20. 5.被动回复用户消息

热门文章

  1. 北航周号益:从“鹦鹉”到“乌鸦”,AI的本质是探索通用智能的可能性
  2. SpringCloud五大神兽之Eureka服务注册(一)
  3. 设置textview字体样式
  4. matlab中的covsfa什么意思,MALSAR1.1 多种多任务学习算法的工具箱 有代码有使 册 matlab版 238万源代码下载- www.pudn.com...
  5. 对于数据挖掘的几点认识[转]
  6. 程序员漫画集连载[1]
  7. 机器人来了!日本保险巨头启用AI替换30%理赔部员工
  8. 一个Bug案例的解决过程:连续输入错误的PIN码,不能实现第二次倒计时30s才能重试
  9. 从流水线角度看MIPS处理器ISA的实现逻辑以及RTOS操作系统仿真
  10. 部署dashboard