伯禹公益AI《动手学深度学习PyTorch版》Task 02 学习笔记

伯禹公益AI《动手学深度学习PyTorch版》Task 02 学习笔记

Task 02:文本预处理;语言模型;循环神经网络基础

讲实话,这3节课的确硬核。(触碰到了我的知识盲区了)

组里的师兄之前还做人脸识别,做着做着就去搞NLP去了,这东西,听着就很高大上有木有(其实也很成熟了有木有)。

我是抱着一个问题来看这三个视频的,就是,这玩意儿究竟该怎么实现?如何输进去一个句子再输出一个句子,我以前也没查过资料,就自己想,不知道该咋整。

这就体现出大佬的NB了,咱想半天不知道怎么整,别人就一点点把框架搞了出来。

首先,就是文本预处理。在咱们现在学的这点皮毛里面,预处理就是分词,英文就是分单词,中文就更粗暴了,直接每个字分开来(但这样明显有弊端)。这样就有了语料库中每个单词(或者汉字)的词频统计,再建立一个单词到ID的对应关系,将每个单词(或者汉字)都映射成一个数字(双射哦!)。

其次就是语言模型。不学不知道,一学才发现,害,也就那么一回事儿。最初的语言模型可SB了,叫n元语法,就直接把马尔科夫那一套搬过来用,整个公式还没有推导SLAM里面的贝叶斯滤波器一半难度。所以也就问题多多,按照讨论社区里面某位大佬的发言:除了特征稀疏、参数空间过大的问题以外,在中文文本处理领域,中文存在词的语义比英文更复杂、词汇少、特征稀疏、分类精确率低(人家大佬说是这个就是呗,咱也不懂)。总之,文本预处理很重要,语言模型更重要。

语言模型里面还有一件事情,就是时序数据的采样(语句本身是蕴含了时序信息的)。两种方法:随机采样和相邻采样。随机采样呢,就是预先把整个语料库按照时间步长切开成n段,n段之间没有重复,接着,训练的时候,随便从这n段里面任意取着用就完事儿了。相邻采样比较有意思,首先根据batchsize进行语料库的取用,保证取用的部分是batchsize的整数倍并且达到尽可能的长(这个在代码上很好实现)。然后将取用的这一段,按照batchsize分割开来(想象一个长条被均等分割成batchsize段),接着,将这batchsize段纵向堆叠,相当于形成了一个batchsize行的矩阵,在取用数据的时候,我们在这个矩阵上根据时间步长按列取用数据,相当于一个窗口在这个矩阵上从左到右滑动,这个窗口的高为batchsize,宽为时间步长。但是,不是滑动,每次使用时,较之于上一次的位置向右平移时间步长个单位。注意了!这就造成了一个相当有意思的现象,下面会说到,嘻嘻嘻。

最后就是这个循环神经网络基础。狗日的,费了半天劲才明白,丫的权重和偏置是共享的。(老了,脑子不灵光了)。其实本身还是挺容易理解的,比较奇葩的就是中间有个隐藏层,这个隐藏层会输出状态信息。要注意,循环神经网络隐藏层的计算是需要用到 H t 1 H_{t-1} X t X_t 两个量的,这个 H t 1 H_{t-1} 可就有意思了,这个变量相当于是前一个字经过隐藏层之后留下来的信息(当然,里面实际上有之前所有字留下来的信息),所以,在使用相邻采样的时候,我们就可以保留上个批量最后一个字的 H t 1 H_{t-1} ,将其detach之后接着用与下一个批量的第一个字,而随机采样就享受不到这个好处了。

基本上就这些难点和重点,有一说一,给的例子里面的代码写的的确还算漂亮简洁。

发布了10 篇原创文章 · 获赞 8 · 访问量 4577

猜你喜欢

转载自blog.csdn.net/ICE_KoKi/article/details/104287549