Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[L4]实战语言模型~softmax与交叉熵

[L4]实战语言模型~softmax与交叉熵

作者头像
触摸壹缕阳光
发布于 2020-06-04 09:52:18
发布于 2020-06-04 09:52:18
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

抱怨就像搬起石头砸自己的脚,于人无益,于己不利,于事无补。

全文字数:2448字

阅读时间:12分钟

前言

实战语言模型系列:

[L1]实战语言模型~语料词典的生成

[L2]实战语言模型~数据batching

[L3]实战语言模型~构建embedding层

a

Softmax层

在介绍完了如何处理数据以及如何构造样本之后,就可以构建我们的神经网络语言模型了,下面是使用LSTM构建的语言模型的大体结构:

▲使用循环神经网络实现自然语言模型的示意图

那可以看出上面着重写出来的两层:

  1. embedding层;
  2. softmax层;

那接下来介绍softmax层。使用循环神经网络训练语言模型,对于每个cell,其实都相当于是一个有监督的多分类任务,每个词汇表中的单词代表一个类别。如下图所示:

▲单步cell示意图

当训练的时候,我们要做的就是使得输出向量和期望向量(样本label)越接近越好,那交叉熵就是评判两个概率分布之间的距离的常用方法之一。然而神经网络的输出确不一定是一个概率分布,所以这就有了softmax,softmax能够将神经网络前向传播的结果变成一个概率分布,其实可以把softmax当成一个额外的处理层,他把神经网络的输出变成了一个概率分布,也就是每一个输出都是(0~1)之间的小数,并且所有输出的结果之和为1。通过这样的处理,我们就可以轻松的使用交叉熵损失函数来计算真实分布与期望分布的距离,并通过梯度下降算法通过降低交叉熵损失以拟合样本训练模型。

下面看一看softmax是怎么计算的:

▲softmax层

现在我的神经网络有四个输出

,那么经过softmax处理后的输出为:

,通过softmax我们可以计算出

的值。

通过上面的描述我们可以知道,加入softmax层是为了将神经网络的输出转换为概率分布,进而使用交叉熵来计算神经网络输出的概率分布和期望的概率分布之间的距离。

对于使用softmax层处理,可以分成两个步骤:

  1. 使用线性映射将循环神经网络的输出映射为一个维度与词汇表大小相同的向量,这一步的输出叫做logits,其实也就是神经网络实际的输出值(没有加入softmax时候的

);

  1. 调用softmax将logits转化为加和为1的概率,我们可以直接使用tf.nn.softmax(logits)来得到转换后的概率向量;

b

Softmax与交叉熵

在训练语言模型以及对训练好的语言模型的评估好坏(perplexity实际上也是一个交叉熵)的时候,都会用到交叉熵损失函数。而由于softmax和交叉熵损失函数经常一起使用,所以tensorflow对这两个功能进行了统一的封装,并提供了两个函数(当然你也可以分成两步写,先获得经过softmax层得到的结果,然后放入交叉熵的计算公式中进行计算):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(lables = y_,logits = y)
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(lables = y_,logits = y)

那这两个函数有什么区别呢,我们现在一个个的介绍:

  • cross_entropy = tf.nn.softmax_cross_entropy_with_logits(lables = y_,logits = y)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import tensorflow as tf

word_prob_distribution = tf.constant([[0.0,0.0,1.0,0.0],[1.0,0.0,0.0,0.0]])
#假设模型对两个单词的预测时,产生logits分别是[2.0,-1.0,3.0,2.0],[1.0,0.0,-0.5,4.0]
#这个时候的predict_logits是没有经过softmax层处理的y1,y2,y3,y4
predict_logits = tf.constant([[2.0,-1.0,3.0,2.0],[1.0,0.0,-0.5,4.0]])
#使用softmax_cross_entropy_with_logits
loss = tf.nn.softmax_cross_entropy_with_logits(logits = predict_logits,labels = word_prob_distribution)

sess = tf.InteractiveSession()
print(loss.eval())
sess.close()

'''[ 0.56194139  3.07623076]'''
  • cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(lables = y_,logits = y)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import tensorflow as tf

#假设词汇表的大小为4,语料中包含两个单词[2,0],单词在词汇表中的ID编号
word_prob_distribution = tf.constant([2,0])
#假设模型对两个单词的预测时,产生logits分别是[2.0,-1.0,3.0,2.0],[1.0,0.0,-0.5,4.0]
#这个时候的predict_logits是没有经过softmax层处理的y1,y2,y3,y4
predict_logits = tf.constant([[2.0,-1.0,3.0,2.0],[1.0,0.0,-0.5,4.0]])
#使用sparse_softmax_cross_entropy_with_logits
loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits = predict_logits,labels = word_prob_distribution)

sess = tf.InteractiveSession()
print(loss.eval())
sess.close()

'''[ 0.56194139  3.07623076]'''

会发现两个函数的输出结果是相同的,那这两个函数的唯一区别就在于表示真实单词分布的不同,在第一个函数中,我们使用one-hot的表示方式,而在第二个函数中我们使用单词在向量中的最大值的位置,从输出的结果相同也可以看出来,这两种表示方式其实是一样的,在我们的样例中在处理文本的时候,只是将其转换为了词汇表中的对应ID号,并没有将其转换为one-hot(其实他们是等价的),因为其实我们可以使用sparse_softmax_cross_entropy_with_logits函数通过对应单词的词汇表的ID编号也可以轻松的得到交叉熵的loss值。

那softmax + 交叉熵有什么效果呢?下面一个使用softmax+交叉熵的三个输出的神经网络计算流程,只需看最后一行,可以看出梯度下降更新的结果:

  1. 先将所有的logits值先减去对应的softmax的值,也就是推所有;
  2. 然后将真实标记中的对应位置的值加上1,也就是拉一个;

▲按比例推所有拉一个

顺便说一句,由于softmax层以及embedding层的参数占所有参数的比重很大,所以通常我们共享embedding层以及softmax层的参数,这样不仅可以大幅度的减少参数数量而且还能够提高最终模型的效果。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI机器学习与深度学习算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
自然语言处理(一)——语言模型评价方法
参考书 《TensorFlow:实战Google深度学习框架》(第2版) 两个计算交叉熵函数的区别:tf.nn.softmax_cross_entrypy_with_logits和tf.nn.sparse_softmax_cross_entrypy_with_logits #!/usr/bin/env python # -*- coding: UTF-8 -*- # coding=utf-8 """ @author: Li Tian @contact: 694317828@qq.com @soft
py3study
2020/01/17
7260
【TensorFlow】tf.nn.softmax_cross_entropy_with_logits的用法
在计算loss的时候,最常见的一句话就是 tf.nn.softmax_cross_entropy_with_logits ,那么它到底是怎么做的呢?
marsggbo
2018/08/10
5610
NLP笔记:浅谈交叉熵(cross entropy)
故事起源于我之前博客【NLP笔记:fastText模型考察】遇到的一个问题,即pytorch实现的fasttext模型收敛极慢的问题,后来我们在word2vec的demo实验中又一次遇到了这个问题,因此感觉再也不能忽视这个奇葩的问题了,于是我们单独测了一下tensorflow与pytorch的cross entropy实现,发现了如下现象:
codename_cys
2021/03/28
3.1K0
自然语言处理:语言模型与评价方法
假设一门语言中所有可能的句子服从某一个概率分布,每个句子出现的概率加起来为1,那么“语言模型”的任务就是预测每个句子在语言中出现的概率。对于语言中常见的句子,一个好的语言模型应得出相对较高的概率;而对于不合语法的句子,计算出的概率则应接近于零。把句子看成单词的序列,语言模型可以表示为一个计算p(w1,w2,w3,…,wm)的模型。语言模型仅仅对句子出现的概率进行建模,并不尝试去“理解”句子的内容含义。比如说,语言模型能告诉我们什么样的句子是常用句子,但无法告诉我们两句话的意思是否相似或者相反。
博文视点Broadview
2020/06/11
1.1K0
自然语言处理:语言模型与评价方法
【神经网络篇】--基于数据集cifa10的经典模型实例
最终,在cifar-10数据集上,通过一个短时间小迭代的训练,可以达到大致73%的准确率,持续增加max_steps,可以期望准确率逐渐增加 如果max_steps比较大,则推荐使用学习速率衰减decay的SGD进行训练,这样训练过程中能达到的准确率峰值会比较高,大致有86% 其中L2正则以及LRN层的使用都对模型准确率有提升作用,它们都可以提升模型的泛化能力 数据增强Data Augmentation在我们的训练中作用很大,它可以给单幅图增加多个副本,提高图片的利用率,防止对某一张图片结构的学习过拟合 这刚好是利用了图片数据本身的性质,图片的冗余信息量比较大,因此可以制造不同的噪声并让图片依然可以被识别出来。如果神经网络可以克服这些 噪声并准确识别,那么他的泛化能力必然很好。数据增强大大增加了样本量,而数据量的大小恰恰是深度学习最看重的,深度学习可以在图像识别上领先 其他算法的一大因素就是它对海量数据的利用效率非常高。其他算法,可能在数据量大到一定程度时,准确率就不再上升了,而深度学习只要提供足够 多的样本,准确率基本持续提升,所以说它是最适合大数据的算法
LhWorld哥陪你聊算法
2018/09/13
1.8K0
TensorFlow四种Cross Entropy算法的实现和应用
作者:陈迪豪,就职于小米,负责企业深度学习平台搭建,参与过HBase、Docker、OpenStack等开源项目,目前专注于TensorFlow和Kubernetes社区。 原文:TensorFlow四种Cross Entropy算法实现和应用,作者授权CSDN转载。 欢迎技术投稿、约稿、给文章纠错,请发送邮件至heyc@csdn.net 交叉熵介绍 交叉熵(Cross Entropy)是Loss函数的一种(也称为损失函数或代价函数),用于描述模型预测值与真实值的差距大小,常见的Loss函数就是均方
用户1737318
2018/06/06
2.6K0
TensorFlow指南(三)——深度神经网络(初级)
由于本系列博文主要专注于Tensorflow本身,所以还是老样子不会过多讲解神经网络的理论知识。 可以参阅这篇博文来先理解下神经网络:http://blog.csdn.net/u011239443/article/details/76680704
小爷毛毛_卓寿杰
2019/02/13
4190
02 The TensorFlow Way(2)
MachineLP
2018/01/09
8590
02 The TensorFlow Way(2)
深度学习实战篇之 ( 八) -- TensorFlow学习之路(五)
CPU:Central Processing Unit中央处理器,是一台计算机的运算核心和控制核心,
用户5410712
2022/06/01
2370
深度学习实战篇之 ( 八) -- TensorFlow学习之路(五)
tf.nn.*()函数and tf.add()函数
一个叫bias的向量加到一个叫value的矩阵上,是向量与矩阵的每一行进行相加,得到的结果和value矩阵大小相同。
周小董
2019/03/25
2.3K0
tf.nn.*()函数and tf.add()函数
神经网络优化(损失函数:自定义损失函数、交叉熵、softmax())
3、神经网络的层数,通常用神经网络的层数和神经网络待优化的参数的个数 来表示,层数 = 隐藏层的层数 + 1个输出层,总参数 = 总W + 总b
狼啸风云
2020/09/07
2.1K0
线性神经网络——softmax 回归随笔【深度学习】【PyTorch】【d2l】
softmax 函数是一种常用的激活函数,用于将实数向量转换为概率分布向量。它在多类别分类问题中起到重要的作用,并与交叉熵损失函数结合使用。
来杯Sherry
2023/07/24
4650
线性神经网络——softmax 回归随笔【深度学习】【PyTorch】【d2l】
【他山之石】TensorFlow神经网络实现二分类的正确姿势
“他山之石,可以攻玉”,站在巨人的肩膀才能看得更高,走得更远。在科研的道路上,更需借助东风才能更快前行。为此,我们特别搜集整理了一些实用的代码链接,数据集,软件,编程技巧等,开辟“他山之石”专栏,助你乘风破浪,一路奋勇向前,敬请关注。
马上科普尚尚
2021/03/17
9670
【他山之石】TensorFlow神经网络实现二分类的正确姿势
tensorflow 常用API
注意tensorflow会检查类型,不指定类型时按照默认类型,如1认为是int32, 1.0认为是float32
羽翰尘
2019/11/21
5630
第三章(1.6)tensorflow cross_entropy 四种交叉熵计算函数
以下交叉熵计算函数输入中的logits都不是softmax或sigmoid的输出,因为它在函数内部进行了sigmoid或softmax操作
两只橙
2019/02/14
1.5K0
第三章(1.6)tensorflow cross_entropy 四种交叉熵计算函数
独家 | 一文读懂TensorFlow基础
本文长度为7196字,建议阅读10分钟 本文为你讲解如何使用Tensorflow进行机器学习和深度学习。 1. 前言 深度学习算法的成功使人工智能的研究和应用取得了突破性进展,并极大地改变了我们的生活。越来越多的开发人员都在学习深度学习方面的开发技术。Google推出的TensorFlow是目前最为流行的开源深度学习框架,在图形分类、音频处理、推荐系统和自然语言处理等场景下都有丰富的应用。尽管功能强大,该框架学习门槛并不高,只要掌握Python安装和使用,并对机器学习和神经网络方面的知识有所了解就可以上
数据派THU
2018/01/30
1.1K0
独家 | 一文读懂TensorFlow基础
(一)Tensorflow搭建普通神经网络实现MNIST手写字体识别及预测
输入层数据为维度(1, 784),其中1表示数据数量,因为网络一次只处理一张图片,所以为1,784是图像数据维度,将$28\times 28 \times1$的数据处理成一个列向量,便于存储,若向显示,则需要将其回复到源尺寸,参见博客MNIST手写字体数据集解析.
xdq101
2019/05/31
1.2K0
(一)Tensorflow搭建普通神经网络实现MNIST手写字体识别及预测
使用TensorFlow训练循环神经网络语言模型
读了将近一个下午的TensorFlow Recurrent Neural Network教程,翻看其在PTB上的实现,感觉晦涩难懂,因此参考了部分代码,自己写了一个简化版的Language Model,思路借鉴了Keras的LSTM text generation。
Gaussic
2018/08/17
8980
使用TensorFlow训练循环神经网络语言模型
全面直观认识深度神经网络
作者:石文华 编辑:赵一帆 01 深度学习的精准定义 一类通过多层非线性变换对高复杂性数据建模算法的集合。它的两个非常重要的特征是多层性和非线性。俗称多层非线性变换。所以深度学习要去线性化。 为什么呢?因为线性模型存在局限性,任意线性模型得到组合仍然还是线性模型。所以只要通过线性变换,任意层的全连接神经网络和单层神经网络模型的表达能力没有任何区别,而且他们都是线性模型,线性模型解决问题的能力是有限的。 02 激活函数实现去线性化 每个神经元(也就是神经网络上的节点)的输出通过一个非线性函数
机器学习算法工程师
2018/03/06
8390
全面直观认识深度神经网络
深度学习进阶:多分类与TensorFlow
到目前为止,我们所接触的都是二分类问题,神经网络输出层只有一个神经元,表示预测输出\hat{y}​y​^​​是正类的概率{P}(y=1|x), \hat{y} > {0.5}P(y=1∣x),​y​^​​>0.5则判断为正类,反之判断为负类。那么对于多分类问题怎么办?
Lansonli
2021/10/09
6910
推荐阅读
相关推荐
自然语言处理(一)——语言模型评价方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验