一、FastText模型1.概念与优势FastText主要用于训练词向量和文本分类其最大优势在于保持较高精度的情况下实现快速的训练和预测。FastText速度快的原因主要有三点模型结构简单只有输入层、隐藏层、输出层三层层次Softmax训练词向量时使用层次Softmax来提升超多类别下的计算性能负采样技术每次训练仅更新一小部分权重大幅降低梯度下降的计算量。需要注意的是FastText模型过于简单无法捕捉词序特征解决办法是采用n-gram特征来弥补缺陷、提升精度。2.模型架构FastText采用经典的三层架构输入层Input对文档进行embedding后的向量包含N-gram特征隐藏层Hidden对输入数据进行求和平均输出层Output文档对应的Label3.层次Softmax3.1 为什么需要层次Softmax传统Softmax在计算多分类时需要计算所有类别的得分再归一化当类别数量非常多时计算量巨大。3.2 层次Softmax的核心思想不再把输出看做扁平的类别列表而是构建一颗哈夫曼二叉树每个叶子节点对应一个类别每个内部节点代表一个二分类逻辑回归问题。3.3 哈弗曼树的构建规则WPL带权路径长度Weight Path Length权值衡量某个节点的重要性的值构建规则将n个权值看成n棵只有根节点的树的森林选取两个根节点权值最小的树合并作为新树的左右子树新树根节点为两者之和从森林中删除选取的两棵树将新树加入森林重复步骤2~3直到森林只剩一棵树3.4 哈夫曼编码规则左分支为0右分支为1从根到叶子节点所经过的0/1序列即为该节点的哈夫曼编码。以下案例中D的哈夫曼编码为110。在预测时从根节点出发每个二分类节点输出一个概率路径上所有概率相乘即为最终类别概率。4.负采样4.1 为什么需要负采样?以Skip-Gram训练词向量为例若词汇量达上万个每次计算softmax概率时需要计算上万个概率值且每个值都要反向传播更新参数计算资源消耗巨大训练缓慢。4.2 负采样的核心思想每次训练仅更新一小部分权重而非全部。具体做法是对于正样本期望输出1同时随机选取少量负样本期望输出0。训练时只更新正样本和负样本对应的权重。4.3 负采样的优势提高训练速度损失计算更简单增加负样本能模拟真实噪声增强模型稳健性小规模数据集选5-20个negative words大规模数据集选2-5个negative words二、文本分类1.概念与种类文本分类将文档分配到一个或多个类别属于有监督学习需要标签。三种分类类型类型含义例子二分类非此即彼二选一好评 vs 差评单标签多分类多选一单选题判断人名属于哪个国家多标签多分类多选多可同时属于多类一段讨论涉及美食体育游戏2.FastText数据格式FastText有监督学习的训练数据格式如下__label__类别 词1 词2 ... 词N单标签示例__label__baking How much does potato starch affect a cheese sauce recipe?多标签示例__label__sauce __label__cheese How much does potato starch affect a cheese sauce recipe?三、实操案例数据集使用Facebook AI提供的烹饪数据集cooking.stackexchange为多标签多分类问题。1.数据获取与预处理数据获取# 下载数据集curl-ocooking.stackexchange.tar.gz https://dl.fbaipublicfiles.com/fasttext/data/cooking.stackexchange.tar.gz# 解压tar-xvzfcooking.stackexchange.tar.gz解压后得到这三个文件数据预处理importos input_filer03_FasttextClassifier\data\cooking.stackexchange.txtwithopen(input_file,r,encodingutf-8)asf:# 读取所有行linesf.readlines()# 按8/2划分split_idxint(len(lines)*0.8)train_lineslines[:split_idx]valid_lineslines[split_idx:]# 写入文件withopen(r03_FasttextClassifier\data\train_dataset.txt,w,encodingutf-8)asf:f.writelines(train_lines)withopen(r03_FasttextClassifier\data\valid_dataset.txt,w,encodingutf-8)asf:f.writelines(valid_lines)print(训练集已生成)2.基础模型训练importfasttext modelfasttext.train_supervised(r03_FasttextClassifier\data\train_dataset.txt)# 评估模型样本数精确率召回率resultmodel.test(r03_FasttextClassifier\data\valid_dataset.txt)print(f评估模型{result})# 预测predmodel.predict(Which baking dish is best to bake a banana bread ?)print(f预测结果{pred[0][0][9:]}) 评估模型(3081, 0.15676728334956183, 0.06791338582677166) 预测结果baking 3.手动调参优化3.1 增加训练轮数importfasttext modelfasttext.train_supervised(r03_FasttextClassifier\data\train_dataset.txt,epoch25)resultmodel.test(r03_FasttextClassifier\data\valid_dataset.txt)predmodel.predict(Which baking dish is best to bake a banana bread ?)print(f评估模型{result})print(f预测结果{pred[0][0][9:]}) 评估模型(3081, 0.45796819214540735, 0.1983970753655793) 预测结果baking 3.2 调整学习率importfasttext modelfasttext.train_supervised(r03_FasttextClassifier\data\train_dataset.txt,epoch25,lr0.1)resultmodel.test(r03_FasttextClassifier\data\valid_dataset.txt)predmodel.predict(Which baking dish is best to bake a banana bread ?)print(f评估模型{result})print(f预测结果{pred[0][0][9:]}) 评估模型(3081, 0.45666991236611487, 0.19783464566929135) 预测结果baking 3.3 增加n-gram特征importfasttext modelfasttext.train_supervised(r03_FasttextClassifier\data\train_dataset.txt,epoch25,lr0.1,wordNgrams2)resultmodel.test(r03_FasttextClassifier\data\valid_dataset.txt)predmodel.predict(Which baking dish is best to bake a banana bread ?)print(f评估模型{result})print(f预测结果{pred[0][0][9:]}) 评估模型(3081, 0.32554365465757873, 0.14102924634420697) 预测结果baking 3.4 使用层次Softmax替代普通Softmaximportfasttext modelfasttext.train_supervised(r03_FasttextClassifier\data\train_dataset.txt,epoch25,lr0.1,wordNgrams2,losshs)resultmodel.test(r03_FasttextClassifier\data\valid_dataset.txt)predmodel.predict(Which baking dish is best to bake a banana bread ?)print(f评估模型{result})print(f预测结果{pred[0][0][9:]}) 评估模型(3081, 0.36968516715352157, 0.16015185601799775) 预测结果baking 4.自动超参数调优fromtabnannyimportverboseimportfasttext modelfasttext.train_supervised(r03_FasttextClassifier\data\train_dataset.txt,autotuneValidationFiler03_FasttextClassifier\data\valid_dataset.txt,autotuneDuration60,# 自动调优时长秒verbose3# 展示详细训练过程)resultmodel.test(r03_FasttextClassifier\data\valid_dataset.txt)print(f评估模型{result}) 评估模型(3081, 0.36968516715352157, 0.16015185601799775) 预测结果baking 四、总结FastText是NLP领域高效实用的工具包核心价值在于兼顾精度与速度。其三层架构简单直接通过层次Softmax解决多分类计算量大的问题通过负采样降低梯度下降的计算开销同时用n-gram特征弥补无法捕捉词序的缺陷。优化方向方法效果数据质量预处理标点符号precision明显提升训练轮数epoch: 5→25precision从0.12→0.52学习率lr: 0.05→1.0收敛更快词序特征wordNgrams: 1→2precision→0.61多标签分类loss‘ova’正确处理多标签场景自动调参autotune自动搜索最优超参数
day30_fasttext分类任务
一、FastText模型1.概念与优势FastText主要用于训练词向量和文本分类其最大优势在于保持较高精度的情况下实现快速的训练和预测。FastText速度快的原因主要有三点模型结构简单只有输入层、隐藏层、输出层三层层次Softmax训练词向量时使用层次Softmax来提升超多类别下的计算性能负采样技术每次训练仅更新一小部分权重大幅降低梯度下降的计算量。需要注意的是FastText模型过于简单无法捕捉词序特征解决办法是采用n-gram特征来弥补缺陷、提升精度。2.模型架构FastText采用经典的三层架构输入层Input对文档进行embedding后的向量包含N-gram特征隐藏层Hidden对输入数据进行求和平均输出层Output文档对应的Label3.层次Softmax3.1 为什么需要层次Softmax传统Softmax在计算多分类时需要计算所有类别的得分再归一化当类别数量非常多时计算量巨大。3.2 层次Softmax的核心思想不再把输出看做扁平的类别列表而是构建一颗哈夫曼二叉树每个叶子节点对应一个类别每个内部节点代表一个二分类逻辑回归问题。3.3 哈弗曼树的构建规则WPL带权路径长度Weight Path Length权值衡量某个节点的重要性的值构建规则将n个权值看成n棵只有根节点的树的森林选取两个根节点权值最小的树合并作为新树的左右子树新树根节点为两者之和从森林中删除选取的两棵树将新树加入森林重复步骤2~3直到森林只剩一棵树3.4 哈夫曼编码规则左分支为0右分支为1从根到叶子节点所经过的0/1序列即为该节点的哈夫曼编码。以下案例中D的哈夫曼编码为110。在预测时从根节点出发每个二分类节点输出一个概率路径上所有概率相乘即为最终类别概率。4.负采样4.1 为什么需要负采样?以Skip-Gram训练词向量为例若词汇量达上万个每次计算softmax概率时需要计算上万个概率值且每个值都要反向传播更新参数计算资源消耗巨大训练缓慢。4.2 负采样的核心思想每次训练仅更新一小部分权重而非全部。具体做法是对于正样本期望输出1同时随机选取少量负样本期望输出0。训练时只更新正样本和负样本对应的权重。4.3 负采样的优势提高训练速度损失计算更简单增加负样本能模拟真实噪声增强模型稳健性小规模数据集选5-20个negative words大规模数据集选2-5个negative words二、文本分类1.概念与种类文本分类将文档分配到一个或多个类别属于有监督学习需要标签。三种分类类型类型含义例子二分类非此即彼二选一好评 vs 差评单标签多分类多选一单选题判断人名属于哪个国家多标签多分类多选多可同时属于多类一段讨论涉及美食体育游戏2.FastText数据格式FastText有监督学习的训练数据格式如下__label__类别 词1 词2 ... 词N单标签示例__label__baking How much does potato starch affect a cheese sauce recipe?多标签示例__label__sauce __label__cheese How much does potato starch affect a cheese sauce recipe?三、实操案例数据集使用Facebook AI提供的烹饪数据集cooking.stackexchange为多标签多分类问题。1.数据获取与预处理数据获取# 下载数据集curl-ocooking.stackexchange.tar.gz https://dl.fbaipublicfiles.com/fasttext/data/cooking.stackexchange.tar.gz# 解压tar-xvzfcooking.stackexchange.tar.gz解压后得到这三个文件数据预处理importos input_filer03_FasttextClassifier\data\cooking.stackexchange.txtwithopen(input_file,r,encodingutf-8)asf:# 读取所有行linesf.readlines()# 按8/2划分split_idxint(len(lines)*0.8)train_lineslines[:split_idx]valid_lineslines[split_idx:]# 写入文件withopen(r03_FasttextClassifier\data\train_dataset.txt,w,encodingutf-8)asf:f.writelines(train_lines)withopen(r03_FasttextClassifier\data\valid_dataset.txt,w,encodingutf-8)asf:f.writelines(valid_lines)print(训练集已生成)2.基础模型训练importfasttext modelfasttext.train_supervised(r03_FasttextClassifier\data\train_dataset.txt)# 评估模型样本数精确率召回率resultmodel.test(r03_FasttextClassifier\data\valid_dataset.txt)print(f评估模型{result})# 预测predmodel.predict(Which baking dish is best to bake a banana bread ?)print(f预测结果{pred[0][0][9:]}) 评估模型(3081, 0.15676728334956183, 0.06791338582677166) 预测结果baking 3.手动调参优化3.1 增加训练轮数importfasttext modelfasttext.train_supervised(r03_FasttextClassifier\data\train_dataset.txt,epoch25)resultmodel.test(r03_FasttextClassifier\data\valid_dataset.txt)predmodel.predict(Which baking dish is best to bake a banana bread ?)print(f评估模型{result})print(f预测结果{pred[0][0][9:]}) 评估模型(3081, 0.45796819214540735, 0.1983970753655793) 预测结果baking 3.2 调整学习率importfasttext modelfasttext.train_supervised(r03_FasttextClassifier\data\train_dataset.txt,epoch25,lr0.1)resultmodel.test(r03_FasttextClassifier\data\valid_dataset.txt)predmodel.predict(Which baking dish is best to bake a banana bread ?)print(f评估模型{result})print(f预测结果{pred[0][0][9:]}) 评估模型(3081, 0.45666991236611487, 0.19783464566929135) 预测结果baking 3.3 增加n-gram特征importfasttext modelfasttext.train_supervised(r03_FasttextClassifier\data\train_dataset.txt,epoch25,lr0.1,wordNgrams2)resultmodel.test(r03_FasttextClassifier\data\valid_dataset.txt)predmodel.predict(Which baking dish is best to bake a banana bread ?)print(f评估模型{result})print(f预测结果{pred[0][0][9:]}) 评估模型(3081, 0.32554365465757873, 0.14102924634420697) 预测结果baking 3.4 使用层次Softmax替代普通Softmaximportfasttext modelfasttext.train_supervised(r03_FasttextClassifier\data\train_dataset.txt,epoch25,lr0.1,wordNgrams2,losshs)resultmodel.test(r03_FasttextClassifier\data\valid_dataset.txt)predmodel.predict(Which baking dish is best to bake a banana bread ?)print(f评估模型{result})print(f预测结果{pred[0][0][9:]}) 评估模型(3081, 0.36968516715352157, 0.16015185601799775) 预测结果baking 4.自动超参数调优fromtabnannyimportverboseimportfasttext modelfasttext.train_supervised(r03_FasttextClassifier\data\train_dataset.txt,autotuneValidationFiler03_FasttextClassifier\data\valid_dataset.txt,autotuneDuration60,# 自动调优时长秒verbose3# 展示详细训练过程)resultmodel.test(r03_FasttextClassifier\data\valid_dataset.txt)print(f评估模型{result}) 评估模型(3081, 0.36968516715352157, 0.16015185601799775) 预测结果baking 四、总结FastText是NLP领域高效实用的工具包核心价值在于兼顾精度与速度。其三层架构简单直接通过层次Softmax解决多分类计算量大的问题通过负采样降低梯度下降的计算开销同时用n-gram特征弥补无法捕捉词序的缺陷。优化方向方法效果数据质量预处理标点符号precision明显提升训练轮数epoch: 5→25precision从0.12→0.52学习率lr: 0.05→1.0收敛更快词序特征wordNgrams: 1→2precision→0.61多标签分类loss‘ova’正确处理多标签场景自动调参autotune自动搜索最优超参数