一、深度学习与线性代数
在计算机的内存或硬盘中,数据通常是以字符集编码成0和1的形式进行存储的,读取时再以相同字符集进行解码进行显示的。然而在深度学习中,数据在内存或显存中的表示都是以向量的形式表示的。
1、字符在计算机中的表示
在我们所接触到的手机、电脑、电视所呈现的字符,其原理大概:就是存储在内存、硬盘中的0和1的数字被解码成字符再去映射到屏幕上。目前最常见的编码格式有:
- ASCII:初代计算机采用的字符集。仅包含(大小写英文字母、数字、标点符号、控制字符等用8bit存储的128个字符)
- GBK:国标扩展,是一套适用于中文的字符集。
- Unicode:ISO组织提倡统一各民族语言数据集。但没有被广泛落实
- UTF-8:可变长的编码格式,目前被各国广泛使用
以UTF-8为例。"中国"二字用utf-8进行编码为16进制的“\xe4\xb8\xad\xe5\x9b\xbd”,再将其转化为二进制就是“中国”二字在计算机里存在的形式了。
附: 乱码问题
当我们再打开一个文件发现乱码:
原因:编码与解码字符集不一致所导致的,比如我们在计算机中是以utf-8字符集存储的,但在编辑其中以gbk的形式进行解码就会出现乱码现象,因为每个字符在不同字符集的存储形式并不一样(如图),所以我们要保证在编码和解码时要使用相同的数据集。
2、深度学习-线性代数
2.1 深度学习
深度学习,通俗点讲就是让模型能够在所提供的数据中找到规律并能举一反三,
比如在计算机视觉中,你向模型提供很多猫的图片,让它能记住猫的特征,目的就是在推理中识别出那一张是猫。再比如在自然语言处理中,你向模型提供很多数据集进去,让他记住各词之间的关系,以便你向他输入一段话,他能输出一些相关的东西出来。
在中文中,我们都知道 “苹” 字后跟的只能是 “果” ,“葡” 字后跟的只能就是 “萄”。但是,模型不知道。 按照使用utf-8数据集,他能很容易的表示出 “苹” 和 “果” ,但他无法建立 “苹” 和 “果” 之间的关系、“葡” 和 “萄” 之间的关系…。为了能表示出他们之间的关系,我们就不能采用以数据存储为目标的编码解码规则。
2.2 深度学习中的线性代数
以对“我爱苹果”作为输入举例:
往圣先贤的做法是用向量表示词元,用矩阵表示语意空间
Step1:独热编码
-
“我” ->
[1, 0, 0, 0]
-
“爱” ->
[0, 1, 0, 0]
-
“苹” ->
[0, 0, 1, 0]
-
“果” ->
[0, 0, 0, 1]
单看这一步相对utf-8等编码并不见高明,重点是词嵌入后的建模
Step2:词嵌入(Embedding)
独热编码是高纬向量,而且无法表现各词之间的关系。我们在这一步的目的是:无损压缩。尽量在此过程总不丢弃原始字符的所有特征。
比如压缩后的编码为:
-
“我” ->
[0.5, 1.2]
-
“爱” ->
[-0.7, 0.9]
-
“苹” ->
[1.0, 0.2]
-
“果” ->
[1.2, 0.1]
Step3:建模
假如我们使用的是RNN模型,它会在处理“我爱苹果”后,输出一个表示该序列的隐藏状态向量。通过大量的训练,该模型能够学习到“苹”和“果”两个字在模型中都是共同出现的,进而在向量空间中更紧密地联系在一起。比如:
-
“我” ->
[0.1, 1.4]
-
“爱” ->
[0.3, 0.2]
-
“苹” ->
[0.8, 0.9]
-
“果” ->
[0.85, 0.88]
发现 “苹” 和 “果” 这两个词的向量在空间中相对接近,而与 “我”、“爱” 等其他词相对较远。通过大量训练,当我们在向模型输入“我爱苹”后,模型就会预测到你下一个字输入的是 “果”。这一切,我们都是借助线性代数中的知识完成的。
2.3 学好线性代数
个人理解,线性代数对于深度学习来讲最大的优势就是它是可以表示出高纬空间。
- 他能用向量的形式表示出数据,以及各数据之间的关系。
- 他能用矩阵的形式处理和组织大量数据,并通过线性变换对数据进行各种操作。帮助模型在不同层之间传递信息