记得 2011 年前后,流量广告、计算广告、推荐算法,以及用户画像这些都是特别热门的话题。在这些领域的有很多场景都可以用到机器学习,比如广告的推荐、推荐的商品排序,以及用户画像的各种人口统计学特征的预测等等。
那个时候使用的最多的就是传统的各种机器学习模型,工业界很常见的逻辑回归模型:SVM、GBDT 等等。这种传统机器学习模型工作量最大的地方,有百分之六七十的工作量都在特征工程,要根据业务的特点设计大量的 Feature,去帮助提升模型预测的泛化能力,尤其是像广告的点击率预估这种问题,特征的好坏直接决定了最终的效果。
有些公司专门做特征的团队就有上百人,因为这部分的工作量是非常大的,那么在面临这种工作量如此巨大的特征工程时,有没有办法去改善甚至解决这方面的问题呢?
深度学习在这方面就做得特别好,它通过 pre-training 可以将数据里面的特征自动提取出来,再直接基于原始的数据,就能训练出一个模型,而且它的效果相比传统的机器学习有显著的改善,这就是为什么说深度学习在这些年得到了这么火热的欢迎,以及在工业界得到了大量的使用。
大家都知道,其实深度学习采用的神经网络,尤其是神经网络很复杂的时候,训练的时间特别长,有时候甚至几天、一个月都是常见的。这么长的时间显然会影响神经网络在实际问题当中的应用,那么有什么办法呢?
随着最近几年,大数据技术的各种发展,以及 GPU 计算能力的大幅度提升,使得神经网络的计算效率得到了显著的提升,因此深度学习也取得了很大的成功。
最开始是在图像,然后慢慢应用在语音领域,但最近几年在 NLP 的很多问题上也取得了显著的成功。
百分点的整个 NLP 算法体系分为三层:
底层是机器学习平台,里面包括各种传统的统计模型类的方法:逻辑回归、最大熵、HMM 和 CRF,这些都是在 NLP 里面用的很多的。同时还包括 Deep Learning,其中有 CNN,LSTM 等等,还有 GRU;
中间层是 NLP 常见的基础的任务,包括分词词性标注、命名实体、情感分析、文本分类等等,这一层会用到底层的机器学习平台的各种模型,来解决这些基本的问题;
最上面一层是 NLP 的各种应用的场景,比如说智能审核、智能采编、自动问答,以及文本的自动生成、知识图谱等等,也会用到中间层的各种基本的 NLP 模块。
接下来我们重点分析一下深度学习如何在一些基本的 NLP 任务当中使用,包括分词、命名实体以及情感分析这三块。
首先看一下,分词 NER 这两个基本任务。如果对 NLP 有些了解的人都知道,这方面的传统方法主要包括两大类:
字典规则的匹配,比如分词的最大增强匹配、反向匹配、方向匹配等等,这些都是用了字典规则的方法;
传统的机器学习方法,比如说常见的隐马尔可夫(HMM)、条件随机场(CRF)、最大熵马尔可夫模型(MEMM)等等。
这些方法有什么问题?
首先它们有大量的特征工作要做,就是刚说的传统的机器学习方法存在一个非常大的问题,就是它需要大量的人工来做;
第二个问题是领域的移植性问题,比如说在金融领域做了一个分词模型,可能依靠了大量的词典和规则,但是可能转移到一个新的领域,比如说媒体这个领域时候,又要做很多词库和规则,移植性很差;
第三就是一些未登录词的识别效果也很差,因此大家才希望能够用深度学习来做。
首先第一个方面,它能够解决特征工程的问题,避免了大量的人力工作;同时它的领域移植性要好的多,整个工作量能得到显著的降低;此外,在新词识别这块的效果也好很多。
那么具体采用的是一个什么模型呢?
在实际工作中采用的是 LSTM+CRF 的组合。该组合在这方面已经得到了非常成功的使用,它把一个分词和命名实体识别问题转化为了一个序列标注问题。
可以看一下左边这张图,拿命名实体来说,序列标注前首先建立一个标准,B 开头代表实体的首字、I 代表实体的非首字:B-PER 和 I-PER 代表的就是人名的首字,和人名的非首字,同样地点和组织机构也是这么来表示的。
“中国很大”这样四个字用模型来给它做标注:“中”是什么?中国首先是一个地点名,那么把“中”就标识为地名的一个首字,B-LOC;“国”就是代表地名的一个非首字,代表中间的这个字,I-LOC;“很”和“大”这两个字都代表它们不属于任何一个实体的一部分,因此都标示为 O。
在上面整个图中,就是 LSTM 上面加了一个 CRF 层,CRF 就是条件随机场,相信学过自然语言处理的同学对 CRF 已经非常熟悉了。
在整个深度学习领域当中,一类问题是分类问题,比如说人脸的识别、目标的识别等等,用传统的前馈神经网络就能做得很好;还有另外一类问题特别 依赖于序列之间的关系,这种依赖关系对于整个任务的结果有很大的影响,这时候就需要用到循环神经网络——RNN。
RNN 在求解的过程中会有遇到一个梯度消失的问题。经过了多年的研究,最后出来了 LSTM 模型,它很好的解决了这个问题。它在应用这种基于序列的问题上有很好的表现,同时应用场景非常广泛。
根据输入和输出的情况可以分为下面四种:
首先是一对一,对中文的分词,比如输入了一个词,要给它一个唯一的标注,同时还包括其他命名实体、文本生成,这些都是一对一的问题。
第二类是多对一,比如说情感分析,输入的是一段文字,但输出的是情感,比如某件事是好还是坏,或者正面还是负面,其他的还有文本分类、视频主题分类等等。
第三个是多对多,比如机器翻译,输入一段文字,输入是一段中文出来的是一段英文,还有聊天机器人等等。
最后一种是一对多,输入的是一张图片,给它输出一张文字序列,LSTM 应用的就是这种情况。
LSTM 解决的是序列的问题。
看图中的这样一个网络,对于传统的神经网络模型,输出的 Ht,只依赖于输入的 Xt,它跟前一个单元是没有什么依赖关系的。但是在 LSTM 中每一个单元 t 时刻的输出,与前一个时刻 t-1 之间的状态,是有一个比较强的依赖关系。
可能大家在学习经常会比较费解什么叫 t 时刻,什么叫 t-1 时刻,就拿刚才的这个例子来说,“中国很大”这四个字,“中”它就是 t=1 这个时刻,它的输出就是 B-LOC 这样一个标注;“国”就是 t=2 时刻,它的前一个时刻就是“中”,“国”的输出是 I-LOC;那么“很”就是 t= 3 时刻,“大”就是 t=4 时刻。
这样类比的时间序列关系,大家碰到时刻这个概念的时候一定要理解,它是跟一句话能够对应起来的。这个时刻就代表了这个字在一句话当中的位置,做了这样一个类比,大家一定要首先理解这一点。
在 LSTM 当中,t 时刻是依赖于 t-1 的,具体是个什么样的依赖?
在这个结构当中有个非常重要的元素: 单元状态 C。
Ct-1 是 t-1 时刻神经网络单元的输出,它是 LSTM 具备长短期记忆能力的关键,它就像一个链一样,在不断的传输,不断会有信息的衰减,也会有信息的新增加,不断的从 t-1 时刻不断的往右边传递到最后一个时刻。
在整个长期状态的传播当中会有三个控制开关去决定状态 C 是怎么传递的。
从 t 时刻传递到最后一个时刻经过了这样三个门: 遗忘门、输入门和输出门。
首先看一下遗忘门 ft。
ft 是个向量,向量中的每个元素取值是 0 到 1 之间,那么 ft 的取值决定了 Ct-1 的状态过滤多少信息,并传递到第 t 个状态。比如说如果 ft=0,表示所有的信息都被卡住了,一点都传不过去;如果 t=1,表示 t-1 时刻的状态信息,全部都传到 Ct 那边去了,它表示的是这样一个物理含义。
第二个门叫输入门。
也就是这里的 It,It 它是由 Xt 和 Ht 共同决定的,它也是一个向量,每个元素也是在 0 到 1 之间。那么它和输入 Xt 一起决定了从输入当中要提取什么样的信息,来传播给单元状态 Ct,它决定了从输入 Xt 获取什么样的信息往下个时刻去传。
再看一下输出门。
输出门的 Ot,取值也是个向量,取值 0 到 1 之间。那么它是决定了 t 时刻的输出和状态 C 之间是个什么样的关系。可以看到 t 时刻的状态 Ct,它是用两部分组成的,一部分就是 Ct-1 传递过来的,过滤出来的一部分信息,另外一部分信息是从输入 Xt 里面直接抽取出来的信息,它是两部分信息合成的一个结果。那么有了 Ct 之后,再结合输出门 Ot,就能直接计算出 t 时刻的输出 Ht。
刚才的解释就是对输入门、输出门、遗忘门的一个解释。整个的网络单元看起来比较复杂,其实它都是有一个明确的物理的含义,整个的核心就是:去解释每个神经网络的单元状态是如何传递到下一个时刻、如何进行信息的衰减,以及如何从状态 t 时刻的输入去提取新的信息让 Ct 得到更新。理解神经网络当中的物理含义是非常重要的。
再看一下,LSTM 结合 CRF 的数学原理。好多同学一看到这个数学公式,可能脑袋就大了,其实你真正理解它的物理含义以后,它们并没有那么复杂。
图中的下方的输入 X 代表了每个字向量,这个字向量可以通过大量的语料,通过无监督的方式训练出来。Y 对应是输入的每个字,它输出的标注是什么。
那么有了对应的输入输出,有了大规模的训练语料以后,那么如何来求解这个模型的参数?
可以看的出来,整个这一层 LSTM’s ouput 非常的关键:s(x,y),它由两部分组成:一部分是加 Ay,y+1,它代表着 Y 输出的标注从第 I 个状态转移到 I+1 的状态,所转移得到这样一个分数。
另外一部分就是 Pi,yi,代表的是整个 LSTM 的输出。
当 LSTM 输出的 Pi,yi,再加上了 CRF 状态之间的转移分数,进行一个求和,这样将两个模型的特性都比较好的融合在一起,输出 s(x,y)这样一个分数之后,进行归一化,就得到 P(Y|X)。同时,每个输入对应着一个标注,通过反向传播梯度求解,以及参数更新,最后可以将所有模型参数都计算出来。
直接采用 LSTM 就能预测输出序列了,为什么后面还要接个 CRF 模型? 计算复杂度反而提高了,那么 CRF 到底带来一个什么样的好处?
首先,采用单个 LSTM 预测出来标签是有问题的。因为每个字在标签当中是独立的分类,没有去利用上下文已经预测出来的标签结果,进而导致预测出来的标签有可能是非法的。
看一下中间这个例子:这里面是做了个分词,把分词转换为一个序列标注的问题。B 代表一个词的开始,E 代表一个词的结束,S 代表一个字可以单独的作为一个词。
real output,是实际输出的是什么。它的后面,E 又接了一个 E,正确的输出应该是 B,再接一个 E。
这里可以看出来一个明显的错误:一个结束符后面再跟着一个结束符显然是不合理的,说明 LSTM 存在对应的问题。解决这个问题要把 CRF 接在后面,因为 CRF 的特点是比较好的学习到输出状态的转移关系,比如说:前面的一个词的结束,后面应该是接一个新的词开始,或者后面接单独的一个词,所以是不可能出现 E 的。
通过这样的限定特征就保证这个上面这种例子错误不会再出现,LSTM 后面接入一个 CRF 以后,它能够取得比单个 LSTM 更好的效果。
实际在开发、做项目的过程当中,需要同时使用一些模型调优的技巧。这些技巧非常重要,是大家在实际去做深度学习的时候需要掌握的。
Batch_size 指的是什么?就是训练的时候,比如要去计算梯度的时候,或者要去更新参数的时候,拿多少的训练数据去这样一次更新,Batch_size 等于 1,就是传统的 SGD 更新方法,另外,还有采用全量数据进行一次更新方法。
这两种极端都会有它对应的问题,如果 Batch_size 取的太小,就导致整个的收敛速度很慢,甚至收敛会出现问题,而且没有比较好的去利用机器的内存;如果 Batch_size 取得非常的大,可能内存就爆了,因此需要选取一个合理的 Batch_size 数字,**既能够将内存利用起来,同时又能让它比较稳定的去收敛到目标值((。
实际情况当中,经常采用的是 Batch_size 要尽量取 2 的幂指数,比如 32,64,128 都可以,可以提高内存中的计算效率。同时要根据实际的分配内存和显存来估计 Batch_size,保证内存不要爆掉。
第二个技巧是初始化权重参数,就是整个神经网络里面的结构参数。如果这些参数全都取 0 的话,整个传递下来,所有的取值都是一样的,显然这样是不行的。所以经常采用的是随机初始化的策略,包括高斯分布,均匀分布。Tensorflow 这个框架里面是自带了一系列初始化的函数,以上是第二点。
第三个技巧是 dropout 超参数,这也是很重要的。在神经网络里经常会面临这样一个问题:过拟合,那么 dropout 这样一个参数能够提升整个网络的泛化能力,在上面提到的项目当中,采用字向量输入到双向 LSTM 之前去加入 dropout,进一步提升了效果。这里取值就是 0.5,那么在实际表现当中,准确率会有几个百分点的显著提升。
其他的技巧还有包括比如说输入 embedding Size 到底应该怎么去选,中间的隐藏层的维度应该怎么去选,还包括 learning rate 要怎么去选,到底采用什么样训练的方式,是传统 SGD,还是说加动量法等等,都是要选择的,这些也是大家在学习深度学习时候需要的基本功。
那么刚刚讲述的很多的技巧以及原理在实际当中取得了什么样的效果?
v1.3、v1.4 是我们文本分析产品的两个阶段的版本。
1.3 版本采用的是传统的方法,1.4 版本采用了深度学习的方法。可以看得出来: 1.4 会有效果上的一个显著提升,无论是准确度,还是 F1 值都有一个提升。同时与业界的 NLP 方面做得很好的企业,包括 Boson、文智等等都进行了对比。这里选了 Boson 作为代表。因为做了对比之后,发现它是比较具有代表性的。
接下来看一下,基于 Pytorch 的分词性能。在维特比解码这块,它们都采用了 GPU,因此它的速率都有几百 K 的水平,随着 batch_size 在增长,它的性能也是在不断的增加的。同时,batch_size 超过两千的时候内存直接爆了,这时候整个值立马就降下来,这是基于分词的性能。
接下来跟大家分析情感分析当中如何使用深度学习。
具体来说首先第一步,肯定要将文本中的词向量化。这里经常用 one hot representation 来表示,比如这个词表里面有一万个词,那么这个向量长度就是一万,对于每个词都会有个固定的位置,这个位置上取 1,其他的位置上取 0。将其中的词向量化之后,那么接下来再结合这种传统的逻辑回归,或者是 SVM,就能去结合标注数据进行模型的训练,进行情感分析的预测,这是用传统方法来做。
那么用这种方法存在什么样的问题?
第一个问题就是 词序 的信息,在每个词做特征的时候都是比较独立的,因此词序的信息被忽略了,整个效果明显有个上限;第二个问题是,只考虑了字面上的特征,没有考虑词和词之间 语义 上的一个特征;第三个是训练应该覆盖全部序列,就是说在做特征的时候,可能 有些值就直接被筛掉 了,这样很明显会影响最终的效果。
那么深度学习是怎样解决这些问题的?
首先,在离线的时候,直接用训练好的语义向量模型输入,这样能够解决好训练集词的覆盖不全面的问题。其次,用 CNN 卷积神经网络能够保留大部分的词序信息,比如说从 2-gram 甚至能保留到 5-gram,这样的词序信息能够使它的学习能力更强,而且效果的上限就进一步的提升。
onehot representation 有几个比较关键的问题:第一个就是它有个 鸿沟 的问题,词和词之间,找不到它的相关性,比如苹果和香蕉这两个词语,它们有一定语义上的相似性的,但是 one hot representation 完全体现不出来。
第二个就是维度 灾难 的问题,比如库的大小为几万的量级,那么特征维度就会特别长,对于语言模型就有这个问题,就会存在一个维度灾难的问题。
第三个问题,使用 one hot representation 的表示,应用到深度学习当中,训练的复杂度非常高,整体效果会非常差。
基于这三点方面的原因,通常将 one hot representation 改为 distributed representation,分布式的向量 来进行表示,每个词都用一个向量来表示,这样就可用 cosin 和欧式距离表示任意两个词之间的语义长度和语义距离。一般来说用深度学习都是用 embedding 向量,而不是用 one hot representation。
那么这些值向量是如何计算出来的?
大家都应该知道 Google 推出 gensim,在这方面做了非常出色的工作。它采用了两种比较经典的模型:连续词袋模型和 Gram 的跳跃模型。
这两种网络结构能够将结合大规模的语料,训练出所有词的语义向量,对应的每个词都能将它最相似的向量计算出来。比如上图中的“好看”、“很漂亮”、“难看”、“喜欢”,这些都是跟“漂亮”在语义上特别近似的。
语义向量计算出来之后,在情感分析当中具体采用的是 CNN 的模型。大家可能会问,为什么会采用 CNN 模型?当采用全连接的方式时整个网络中的参数是非常多的,几十万、几百万,网络参数一旦数量过多,导致网络模型的求解会非常的慢,甚至会训练一个月,这么长的训练时间是不能忍受的。
另一个问题就是参数越多,模型越复杂,就更容易发生问题。以至于整个模型预测的性能非常差。CNN 的结构包含以下几层:输入层、卷积层、池化层、全连接层、输出层,这里有几个关键的概念:
一、卷积层,大家应该在信号处理里面之间学过,它能够去计算相应元素之间的加权求和,能够起到一个作用就是全体参数共享。什么叫参数共享?就是很多相同位置上的网络中的参数取同样的值,这样就能大大降低神经网络中参数的数量。实现参数的共享,用卷积层。
二、池化层,能够实现空间的亚采样,之前一个小格子,可能包括四个元素,直接对这四个元素求个平均值,一方面能够避免噪声带来的影响,另外一方面也能降低模型需要用到的参数数量。
通过这样两种方式就能够将网络当中的参数数量大幅度的降低,而且 CNN 也被证明在工业界能够取得非常不错的效果。最早 CNN 被应用在图像当中,现在将它应用在文本中的情感分析。
CNN 模型当中,输入采用了一个双通道向量,这也是一个比较重要的技术。以前经常用的传统方法是单通道的方式,CNN 的输入词向量有这么几种:
CNN-rand, 所谓的 word vector 随机初始化,同时在训练过程中进行优化。
CNN-static,直接使用无监督学习的结果,通过 gensim 训练,通过大规模的语料训练,同时用了大量语句当中的信息,比 CNN-rand 效果好很多。
CNN-non-static,它直接使用无监督学习 pre-training 的结果,但是在训练的过程当中,会进行一个细致的微调,这样效果会更好一些。这样一个微调会保证离原始的 word vector 不会太远,同时它能够针对实际的对业务问题做一个更好的优化。
CNN-2Channel,就是这个项目当中采用的方式,它是将 CNN-static 和 CNN-non-static 作了一个混合版,这样保证它结合两者之间的优点。
那么这两种词向量在语义和情感上有什么样的差别?
首先是 static channel,W2V 向量在语义上是很相似的,但是他们在情感上没有相似度,相似度体验的很差。比如 bad 这个词,通过 static channel 训练出来,它的相似词有:good,terrible 等等,bad 首先找的相似词是 good,显然这两个词性是相反的。
对于这种 non-static channel 这种动态的向量,它能够在训练过程,结合情感分析的标注数据进行微调,它能够区别正面或者负面的情感。还是对这个词,bad,经过 non-static channel 动态向量训练,最后首先匹配的相似词是 terrible,horrible 等等,这些都是负面相关的词。通过这种动态的调整,模型能够准确学习到词语所表达的情感。
为了帮助大家去更好的运用 CNN,下面列出了一些在实际模型开发的过程中会存在一些问题:
过拟合比较严重。解决方案:去掉所有停用词性,为偶尔有些动名词很重要设置白名单,将 F1 值提升了两个点。
无法对词的重要程度进行模拟。比如说一句话:你很好,但是你没有耐性。这个“但是”后面表达意思比前面的表达意思要更加重要。解决方案:将转折词后面的词语乘以 1.5 的加权,这是一个经验的取值,然后在程度副词上,要加一个形容词乘以系数,比如:你非常的美,或者:你非常的勤奋,“非常”这样一个程度副词它要进行一定的加权,它的情感会更加强烈。对于否定词,譬如:不好或者不努力等等,在训练过程当中你要乘负的系数。通过这种方式,去模拟这些词表达一种语义和情感的程度,F1 值提升了 1%。
卷积能识别连续若干个词的特征,但是 maxpooling 抹杀了部分语义信息。尝试 LSTM 等 RNN 模型改善效果,但改善不明显,情感分析问题中,这种短小的 n-gram 基本上可以满足,不需要那么长的依赖关系,这就是为什么使用 LSTM 相比 CNN 也没有特别显著的效果。
最后一块是模型本身,通常会使用 dropout 的一些技巧,F1 值可以提升两个百分点。
在 COAE 和 NLPCC 这两个情感分析测试集上进行了测试,传统模型就采用 SVM,同时也采用了 CNN 和 LSTM。看得出来,在 COAE 数据集上提升了四到五个百分点,在 NLPCC 上大约是提升了六个百分点,效果比传统的模型是有显著的提升的。
刚刚提到 CNN 模型,那么采用一些其他的模型,是个什么样的效果?
我们当时在内部采用了不少其他的模型,比如 character-CNN、LSTM,还有递归神经网络,我们在测试集上发现跟目前采用的 2channel-CNN 相比没有明显的差别,另外还有其他的一些网络结构,比如 GRU 等等,本质上都是为不同的网络结构提取带有情感提升的句子向量,利用这些向量进行情感分类,并没有本质的差别。因此,我们后续更多优化的精力是获取更多的标注数据,以及在我们的情感应用产品上,结合用户的反馈数据进一步的发力。
前面我们讲述了深度学习在情感分析当中的一些应用,现在我们已经在 NLP 陆续更多地使用深度学习的技术,包括文本分类、句法分析、文本生成、知识图谱、自动问答等等,我们都去采用深度学习的技术。
前面介绍都是偏基本的任务方面的如何去采用深度学习的内容,我们再来介绍一下具体使用的几个案例。
第一个案例是 AI 李白。
我不知道大家有多少同学接触了这个应用,这是百分点公司和人民日报推出的一个 AI 春节送祝福的应用,相信不少同学都已经用过。它结合了唐诗宋词的韵律和写词的技巧,自动写出带有春节味道的诗词,它就是个写词的机器人。
大家知道对于文本生成来说肯定用到语言模型的,提到语言模型很多人就会说,用 n-gram 这种语言模型,但是它的问题在于无法捕获距离比较长的词语之间的字词依赖关系,因此这里采用 LSTM 的语言模型,大概使用了 70 多万诗词的训练语料,最终也取得非常不错的效果,整个 AI 李白上线六天的时间,获得了超过一千万的访问量,如果大家有兴趣的话,可以去体验一下。
第二个案例是团中央自动问答机器人。
现在团中央有七千万的团员,他们有个青年之声的论坛,每天上面有好几百万的问题,其中有很多的问题其实是得不到及时回答的。做这样一个机器人问答是希望能够对青年之声关注的就业的问题、情感的问题等等进行自动问答,帮助青少年能够更好的成长。
自动问答里面有几个关键的技术问题,比如如何实现问题的匹配,如何自动去计算出问题和答案之间的相似程度,目前都可以采用深度学习去解决这方面的问题,现在内测版已经上线了,接下来会对外推出这款自动问答机器人。
第三个案例是某媒体客户的智能采编系统。
传统的采编系统都是靠人工。比如要产出一篇稿子,需要花大量的力气在关键词提取、摘要等等方面,各种任务都是要靠人。直接将中文语义引擎内嵌到智能采编系统中,使用深度学习来做,可以极大提升采编稿件的效率。
实际上,深度学习、自然语言处理现在在业界有越来越多的实现场景,这也是非常有前途的方向,希望大家一起参与到这个方向,将 NLP 这块的人工智能技术在越来越多的行业落地,谢谢大家!
作者答疑
Q1:深度学习和机器学习有什么区别?
A:深度学习也是机器学习中的一种技术而已,这个问题应该更具体,应该说这种深度学习模型和传统的模型有什么样的差别。对于这个问题而言,我刚刚第一页里面就讲到,传统模型很重要的一块工作是设计这些模型的特征,而且是靠人去设计的,对业务有准确的理解,才能具有泛化能力特征,这也是一门手艺活,这块的工作量是特别大的。为了解决人工去设计特征的工作,我们采用深度学习的技术,就是从数据当中自动发现对应的特征,直接得到一个结果,它是从端到端的一套技术,而且它的效果相比传统机器学习能够有显著的提升。
Q2:训练的时候都是单机吗?有用到集群吗?
基于 tensorflow 的时候,用集群训练,可以用好几个 GPU 来训练;基于 pytroch 的时候是单机的。
Q3:batch_size 的选取,除了内存因素,对于训练的结果,比如准确度,有影响吗?
batch_size 越小,优化路线在走的时候,随机性特别强,可能最后优化到最终目标中间可能会有些问题,会影响准确度;batch_size 过大的时候,内存可能撑不住,内存会直接爆了, batch_size 到了一定的程度,再往上面走的时候,它可能对准确度影响没有那么大,比如 batch_size 取 256,或者取 512,最后都能达到一个近似的最优结果,影响不会特别大。
Q4:机器人自动问答是怎么做的?
自动问答首先需要建立一个非常优质的问题答案资源库,有这个库之后,要在库里找到答案,还涉及几个问题:
第一个是问题与问题之间的等价计算,你问一个问题的时候,你能不能从这个库里面找到等价的问题,这是很关键的,涉及到深度学习;另外一点,比如说我问了一个问题,但是这个库里面有一堆的答案,如何从这个答案里面当中给出最好的,这里涉及到问题和答案匹配问题。用传统的模型也能做,如果采用深度学习也能做,但是对于数据的数量和质量会要求更高。
第二,阅读理解的问题,什么叫阅读理解?答案是存在一个文档中,而不是存在一个 QA 库当中的,在文档中要去挑选出最合适的片段,能够去回答这样一个问题,这时候要找到这个答案的位置,就需要有一个标准的训练数据。有这样的标注数据之后,再去训练这样一个深度学习模型,来了一个新的问题以后,才能去预测出它在文章中的片段位置。
Q5:老师,谢谢您的分享,对于学生来说,没有 AI 工作经验,怎么找该方面的工作呢?
我看有一些同学在问,没有 AI 方面一些工作经验,对于学生来说,怎么找这方面的工作?
相信很多人有这方面的困境,这个时候我给大家分享的是说,第一个,现在有很多的机会,互联网上的资源比我当时读书的时候要丰富的多。我可以分享一些自己的经验,当时我在学校,可能接触没那么多,但是可以加入学校的协会,比如学校的开源软件协会,当时把基础技术都学会了。
至于 AI,第一个,大家可以去上这种培训质量比较高的培训课程,国内 AI 方面的培训课程很多,因为这些培训课程不仅仅是这方面知识的讲解,还会帮助大家进行实践;
第二个方面,我是建议大家有机会可以加入开源的项目,现在 AI 方面,基于机器学习,或者相关的开源项目有很多,针对这些项目,加入一个进去,贡献自己部分的代码。
第三,我建议大家可以把基础打好之后,从找一份实习开始,你如果还是在校生,因为公司对实习生的要求没有那么高,它更多要求你的编程功底扎实,对 AI 一定的了解,可能要求没有那么高,你再通过实习当中的历练去积攒这方面的经验,这也是一个比较好的方式。这是给大家的一些建议。
Q6:要不要学传统机器学习模型算法?
我觉得是要学的。因为这就像基本功,传统机器学习算法里面的很多的模型基本理论、一些泛化理论、一些特征设计的理论、一些模型它为什么效果好,为什么效果不好?它整个模型的一些内在的思想是什么,这些基本功都是要学会的。不然的话,你真的直接上深度学习,你就也只会用一些工具。一旦碰到一些问题的时候,就像如何调参,碰到效果不好的时候,我该怎么办?你如果没有这些理论基础,你就只能去瞎试,试出来是运气好,试不出来也不明白为什么,我建议大家还是要学习机器传统模型理论,这个东西都是要掌握的。这些理论的好处是在你实际项目当中遇到瓶颈、遇到问题的时候,这些理论会指导你,你该去朝什么样的方向去努力,你该怎么去定位问题,这些基础理论还是非常重要的,我建议大家要学一学,直接上来学深度学习,基本功是不扎实的。
评论