目录
中文聊天机器人是这本书第二个实战项目,是基于Seq2Seq模型来实现。NLP,一直都是我想深耕的一个方向,特别是中文的NLP,我觉得非常有挑战性。因此,这个实战项目,我会多花一些时间去研究,并也和大家分享一下。当然,如果大家经济允许,还是比较建议大家去购买此书。
NLP
NLP-自然语言处理,是人工智能(AI)的一个子领域。我个人觉得,NLP应该是人工智能中最为困难的领域之一,特别是中文这个领域。从NLP目前发展情况来看,其实英文方面,还算比较成熟,已逐步落地到我们日常生活中。但中文方面,我个人觉得还是继续努力,可能是因为我们的中文博大精深吧,同一个词语,在不同的场景所表达的意思完全不同。即使是人,我们有时也很难理解清楚。
NLP的应用场景很多,主要包含以下几大类:
文本分类
文本生成
信息检索
信息抽取
问答系统
机器翻译
自动摘要
这次我们主要研究的聊天机器人,属于问答系统这一大类。
语言模型:
语言模型经历过了三个阶段:统计语言模型、n-gram语言模型、神经网络模型。
RNN
循环神经网络(Recurrent Neural Network,RNN),是一种神经网络结构模型,是在神经元之间既有内部的反馈连接又有前馈连接。
RNN缺陷:梯度消失和梯度爆炸。
相比于梯度消失,梯度爆炸带来的后果更严重,但是梯度爆炸的问题却比较容易处理,可以采用限制梯度最大值或者梯度分割的方式来解决。而梯度小时的问题是非常难以解决的,目前只能从网络结构上进行优化,但也不能完全避免。RNN的变种LSTM(长短期记忆神经网络)就是为了解决梯度消失的问题而进行的网络结构优化。
Seq2Seq模型
Seq2Seq(Sequence to Sequence),基于Encoder-Decoder框架的RNN的变种。提高了神经网络对长文本信息的提取能力,比单纯使用LSTM的效果要好,在语言翻译和语言生成领域用得比较广泛。
Seq2Seq两个非常重要的概念:
Encoder-Decoder框架。
Attention机制。
项目中用到的API
tf.keras.preprocessing.text.Tokenizer:将文本进行数字符号化。一般情况下,在进行神经网络训练时,输入数据一般都是数值,因此,做文本处理时,需要把文本字符转换为数值。
tf.keras.preprocessing.sequence.pad_sequences:将训练数据填充成有限数量的维度类别,大幅度降低整个网络规模以提高训练速度和效果。
tf.data.Dataset.from_tensor_slices:将Tensor转换成元素slices的数据集。
tf.keras.layers.Embedding:将正整数转换成固定长度的连续向量。
tf.keras.layers.GRU:是一种RNN神经元结构,是LSTM的优化升级变种。
tf.keras.layers.Dense:全连接的标准神经网络。
tf.expand_dims:作用是在输入的Tensor中增加一个维度。
tf.keras.optimizers.Adam:替代传统随机梯度下降算法的梯度优化算法。
tf.keras.losses.SparseCategoricalCrossentropy:可以接受稀疏编码的多对数交叉熵。
tf.concat:将多个Tensor在同一个维度上进行连接。
tf.bitcast:将Tensor类型转换为我们需要的数据类型。