分类 基础概念 下的文章

v2-3d4a7ff19c9c874dda20b8ecf8ade385_r.jpeg

一、 背景与基础

在使用GPT BERT模型输入词语常常会先进行tokenize ,tokenize具体目标与粒度是什么呢?tokenize也有许多类别及优缺点,这篇文章总结一下各个方法及实际案例。

tokenize的目标是把输入的文本流,切分成一个个子串,每个子串相对有完整的语义,便于学习embedding表达和后续模型的使用。

二、切分粒度

tokenize有三种粒度:word/subword/char

1.词粒度-word

词粒度的切分就跟人类平时理解文本原理一样,常常用一些工具来完成,例如英文的NLTK、SpaCy,中文的jieba、LTP等。举个栗子:

英文
live in New York ------> live / in / New York /

中文
在纽约生活 -----> 在 / 纽约 / 生活
词粒度的切分能够非常好地保留完整语义信息,但是如果出现拼写错误、英文中的缩写等情况,鲁棒性一般。另一方面,词切分会产生非常巨大的词表,而且这都不能确保不会出现out of vocabulary问题。

2.字粒度-char-字符粒度

字粒度最早应该是2015年Karpathy[1]提出,简单说英文就是以字母为单位(对于大小写不敏感的任务,甚至可以先转小写再切分),中文就是以字为单位,举个栗子,

英文
live in New York -----> l / i / v /e / i / n / N / e / w / Y / o / r /k

中文
在纽约生活 -----> 在 / 纽 / 约 / 生 / 活
可以看出,字粒度的切分很好地解决了词粒度的缺陷,鲁棒性增强、词表大大减小。但另一方面,也会带来一些麻烦:

「毫无意义」:一个字母或一个单字本质上并没有任何语义意义;
「增加输入计算压力」:减小词表的代价就是输入长度大大增加,从而输入计算变得更耗时耗力;
如果词粒度不理想,而且字粒度似乎也有自己的问题,那么还有什么替代方法呢?Here comes subword tokenization。

3.Subword粒度

我们需要的tokenization需要满足:

  • 它能够在不需要无限词汇表的情况下处理缺失的标记,即通过有限的已知单词列表来处理无限的潜在词汇。
  • 此外,我们不希望将所有内容分解为单个字符的额外复杂性,因为字符级别可能会丢失单词级别的一些含义和语义细节。

为此,我们需要考虑如何重新利用『小』单词来创建『大』单词。subword tokenization不转换最常见的单词,而是将稀有单词分解成有意义的子词单元。如果unfriendly被标记为一个稀有词,它将被分解为un-friendly-ly,这些单位都是有意义的单位,un的意思是相反的,friend是一个名词,ly则变成副词。这里的挑战是如何进行细分,我们如何获得un-friend-ly而不是unfr-ien-dly。

NLP最火的网红 Transformer 和 BERT 就是Subword的带盐人,来看个它们做tokenization的栗子,

I have a new GPU ----> [’i’, ’have’, ’a’, ’new’, ’gp’, ’##u’, ’.’]
subword粒度切分算法又有一下几种:

1.BPE
2.WordPiece
3.ULM(unigram LM)
4.Sentencepiece

参考:
1.https://cloud.tencent.com/developer/article/1865689
2.https://zhuanlan.zhihu.com/p/340473354

一、概念区别

1. 均方差损失函数(MSE)

简单来说,均方误差(MSE)的含义是求一个batch中n个样本的n个输出与期望输出的差的平方的平均值

2. Cross-entropy(交叉熵损失函数)

交叉熵是用来评估当前训练得到的概率分布与真实分布的差异情况。它刻画的是实际输出(概率)与期望输出(概率)的距离,也就是交叉熵的值越小,两个概率分布就越接近。

为什么分类用交叉熵损失不用平分损失

1.交叉熵loss权重更新更快
    mse:梯度更新表达式包含激活函数的导数
    交叉熵:交叉熵损失函数关于输入权重的梯度表达式与预测值与真实值的误差成正比且不含激活函数的梯度
2.MSE是非凸优化问题而 Cross-entropy 是凸优化问题

可以总结为:
分类中为什么交叉熵损失函数比均方误差损失函数更常用?

答: 交叉熵损失函数关于输入权重的梯度表达式与预测值与真实值的误差成正比且不含激活函数的梯度,而均方误差损失函数关于输入权重的梯度表达式中则含有,由于常用的sigmoid/tanh等激活函数存在梯度饱和区,使得MSE对权重的梯度会很小,参数w调整的慢,训练也慢,而交叉熵损失函数则不会出现此问题,其参数w会根据误差调整,训练更快,效果更好。

详细原因参考下面的图:
请输入图片描述

参考:
1.https://blog.csdn.net/woshiliulei0/article/details/124710184
2.https://aitechtogether.com/article/15966.html

一、sigmoid 函数

1.公式

$y(x) = \frac{1}{1+e^{-x}}$

2.图像

91cbd4d98ba3f9850e62c86b23279d67.jpg

3.性质
  • (1)$y'= y*(1-y)$
  • (2)$y'$导数的最大值为:1/4
4.作用

一般做神经网络最后一层的二分类来用
这个函数非常适合将输入分为两类。它的形状很缓和,因此它的梯度能得到很好的控制。
主要的缺点是,在极端情况下,函数输出变得非常平坦。这意味着它存在梯度消失的问题。

二、softmax函数

1.公式

$y(x)=\frac{e^xi}{\sum_{i=1}^m e^xi}$

2.图像

softmax没有图像,刻画的是百分比,解释图像为
aHR0cHM6Ly9pbWFnZXMyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTE4MDEyMC8yMDE4MDUvMTE4MDEyMC0yMDE4MDUyMDE5MDYzNTg5MS0xNTM3MzA5MDQ4LnBuZw.png

4.作用

一般做神经网络最后一层的多分类来用

三、tanh函数

1.定义

$y(x)=\frac{e^x - e^{-x}}{e^x + e^{-x}}$

2.图像

b279af127ae028ab722718a2ade283ec.jpeg

3.性质
  • (1)$y'= 1- y^2$
  • (2)$y'$导数的最大值为:1
4.作用

它与Sigmoid非常相似。函数曲线更陡峭,因此它的输出也将更强大。缺点与Sigmoid类似。

四、RELU函数

1.定义

线性整流函数(Linear rectification function),又称修正线性单元,是一种人工神经网络中常用的激活函数(activation function),通常指代以斜坡函数及其变种为代表的非线性函数。
f(x)=max(0,x)

2.图像

7d2563cdafbe8545230d6dc5058014bd.jpeg

3.作用

它的输出范围从0到无穷大。这意味着它的输出可能会变得非常大,可能存在梯度爆炸问题。它还有个问题是左侧完全平坦,可能导致梯度消失。

ReLU计算简单,是神经网络内层最常用的激活函数。

参考文献
1.https://blog.csdn.net/u014665013/article/details/86600489

深度学习的几个步骤
一、特征抽取

二、判别模块
对结果概率的判定:得到logits
具体衡量为:
1.通过linear层:分类
2.通过欧氏距离:是否同品
3.通过余弦距离:是否同品
三、损失函数
四、参数更新
误差方向传播