线性回归
线性回归是机器学习中的经典问题,其实本章的意义我认为应该是在于让大家熟悉一下pytorch的编程风格,我本人在本章的收获如下:
1.本地pytorch环境的搭建。询问度娘,几经波折后,我选择了anaconda+cuda+pycharm的方式建立了本地的pytorch环境,简单的三步走,平时在学校没有遇到下载速度太慢的问题,这次在家下载贼慢,我的解决方法是通过某雷下载到本地再pip,后来看群里大佬们讨论,可以更换anconda的源,更换国内镜像获得提速,下次可以尝试一下。
2.yield 函数。通过这次学习,加深了对yield函数的理解,简单来说,它的功能是生成可迭代对象,好处是可以省内存省CPU
3.pytorch中的一些概念。pytorch里面,用的最多的就是tensor了,直接按张量来理解应该就可以。tensor里面涉及到的一个有趣的用法就是view(),这个函数类似于reshape()但是比reshape()要强大,因为它还可以附加维度,参数-1的运用也让tensor的表示更加灵活。此外,tensor还可以进行附加梯度操作,只有附加梯度了的tensor才能在优化器中使用。
4.pytorch的LR简洁实现。这个环节应该是为了告诉我们pytorch的一般工作流程:声明参数——定义模型——初始化模型参数——定义损失函数——定义优化函数——训练。有种使用sklearn的既视感。
Softmax与分类模型
第一章回归,第二章分类,很ML。这里想分享一下的就是softmax 和 corss entropy ,这里运用这两种处理方式是因为在分类问题里,处理的输出和label是离散的。
1.softmax运算符(softmax operator)通过对每个值取指数,再求和做分母的方式将输出值变换成值为正且和为1的概率分布。
2.cross entropy 交叉熵损失函数的优势在于可以更好的衡量模型的好坏,而且该损失函数在计算的时候只有分类正确的对最后的值有贡献。
多层感知机
这一章介绍了激活函数。多层的网络结构+非线性激活函数,从这章开始感觉到了从ML到DL的转变。
1.relu:
2.sigmoid
3.tanh
4.激活函数的选择:
ReLu函数是一个通用的激活函数,目前在大多数情况下使用。但是,ReLU函数只能在隐藏层中使用。
用于分类器时,sigmoid函数及其组合通常效果更好。由于梯度消失问题,有时要避免使用sigmoid和tanh函数。
在神经网络层数较多的时候,最好使用ReLu函数,ReLu函数比较简单计算量少,而sigmoid和tanh函数计算量大很多。
在选择激活函数的时候可以先选用ReLu函数如果效果不理想可以尝试其他激活函数。
文本预处理
这一章介绍了文本数据的常见预处理步骤,预处理通常包括四个步骤:
1.读入文本
2.分词
3.建立字典,将每个词映射到一个唯一的索引(index)
4.将文本从词的序列转换为索引的序列,方便输入模型
核心的思想即是建立文本到数字的映射,里面涉及到一些细节处理,比如特殊的token,比如正则表达的运用,主要是一些规范性的内容。不过以后应该很少手动造轮子,多半会用介绍到的spaCy或者NLTK
语言模型
这一章介绍了基于统计的语言模型,主要是n元语法(nn-gram)。即将语言文本视为时间序列,用马尔科夫过程来描述词与词之间的相关关系。涉及的主要知识点是连续采样和相邻采样,决定了训练时的数据存储方式。这一章结合上一章可以视为数据的预处理过程。
循环神经网络基础
这一章开始介绍循环神经网络。基础的网络结构如下。
从结构上可以看出,RNN网络不同与传统的ANN,它以时间步为区分,它的隐含层可以将该时间步的输入传递给下时间步,从而使网络具有了记忆能力,所以能够处理时间序列的数据。实现过程中的知识点可以包括:
1.对词的one-hot编码,编码后的向量变得稀疏。
2.针对梯度爆炸的问题,使用裁剪梯度的策略,给梯度设定一个上界。
3.用困惑度来度量语言模型的好坏,值域从1到无穷,值越小表示模型越好
4.在实践jupyter的时候,有一个体会,在做RNN的训练时,要时刻跟踪tensor的维度,设计网络结构的时候,也需要先掌握维度才能设定好参数。
5.在写训练的代码时,不同于经典的网络,这里增加了一个变量state,用来记忆中间状态,这里的区别需要重视。