AttentionLSTM也可简称为atae_lstm,论文主要提出了一种适用于细粒度(fine-grained)文本情感极性分析的网络模型。我们知道,一些酒店或者商品评论往往不止针对商品的一个方面,例如,“披萨的味道棒极了!但是服务真的很差!”评论里涉及了“food”,“service”两个方面的评价,普通的LSTM模型由于无法捕捉有关方面(aspect)的信息,因此无论对于哪个方面的评价,都只会产生一个结果。本文提出的Attention-based LSTM with Aspect Embedding 模型利用方面(aspect)向量以及attention机制为这种分方面评价的问题提供了一个很好的解决方法。
论文:Wang, Y. , et al. "Attention-based LSTM for Aspect-level Sentiment Classification." Proceedings of the 2016 Conference on Empirical Methods in Natural Language Processing 2016.
AttentionLSTM模型的输入由aspect和word向量组成,输入部分输入单层LSTM网络中得到状态向量,再将状态向量与aspect进行连接,计算attention权重,最后用attention权重和状态向量运算得到情感极性分类。
使用的数据集:SemEval 2014 task4 Restaurant (aspect category)
- 数据集大小:
- 训练集:2990个句子,每个句子对应一个aspect和一个极性分类
- 测试集:973个句子,每个句子对应一个aspect和一个极性分类
- 数据格式:xml或者cor文件
- 注:数据将在create_dataset.py中处理,转换为mindrecord格式。
采用混合精度的训练方法使用支持单精度和半精度数据来提高深度学习神经网络的训练速度,同时保持单精度训练所能达到的网络精度。混合精度训练提高计算速度、减少内存使用的同时,支持在特定硬件上训练更大的模型或实现更大批次的训练。 以FP16算子为例,如果输入数据类型为FP32,MindSpore后台会自动降低精度来处理数据。用户可打开INFO日志,搜索“reduce precision”查看精度降低的算子。
- 硬件(Ascend)
- 使用Ascend处理器来搭建硬件环境。
- 框架
- 如需查看详情,请参见如下资源:
通过官方网站安装MindSpore后,您可以按照如下步骤进行训练和评估:
-
Ascend处理器环境运行
# 运行训练示例 bash run_train_ascend.sh [DATA_DIR] [OUTPUT_DIR] # 运行评估示例 bash run_eval_ascend.sh [DATA_DIR] [CKPT_FILE]
├── atae_lstm
├── README.md // AttentionLSTM相关说明
├── scripts
│ ├──run_train_ascend.sh // 在Ascend上训练的shell脚本
│ ├──run_eval_ascend.sh // 在Ascend上评估的shell脚本
│ ├──convert_dataset.sh // 在Ascend上评估的shell脚本
├── src
│ ├──model_utils
│ │ ├──my_utils.py // LSTM相关组件
│ │ ├──rnn_cells.py // LSTM单元
│ │ ├──rnns.py // LSTM
│ │ ├──config.json // 参数设置
│ ├──config.py // 参数生成
│ ├──load_dataset.py // 加载数据集
│ ├──model.py // 模型文件
│ ├──atae_for_train.py // 模型训练文件
│ ├──atae_for_test.py // 模型评估文件
├── train.py // 训练脚本
├── eval.py // 评估脚本
├── preprocess.py // 310推理前处理脚本
├── export.py // 将checkpoint文件导出到air/mindir
在config.json中可以同时配置训练参数和评估参数。
'batch_size':1 # 训练批次大小
'epoch_size':25 # 总计训练epoch数
'momentum':0.89 # 动量
'weight_decay':1e-3 # 权重衰减值
'dim_hidden': 300 # hidden层维度
'rseed': 1
'dim_word': 300 # 词向量维度
'dim_aspect': 100 # aspect向量维度
'optimizer': 'Momentum' # 优化器类型
'vocab_size': 5177 # 单词表大小
'dropout_prob': 0.6 # dropout概率
'aspect_num': 5 # aspect词的数量
'grained': 3 # 极性分类个数
'lr': 0.0125 # 学习率
更多配置细节请参考脚本config.json
。
-
处理原始数据集:
bash convert_dataset.sh \ ./data \ ./data/glove.840B.300d.txt \ ./data/train.mindrecord \ ./data/test.mindrecord
上述命令可以可以生成mindrecord数据集
-
Ascend处理器环境运行
bash run_train_ascend.sh \ /home/workspace/atae_lstm/data/ \ /home/workspace/atae_lstm/train/
上述训练网络的命令将在后台运行,您可以通过net_log.log文件查看结果。
训练结束后,您可在默认脚本文件夹下找到检查点文件。采用以下方式达到损失值:
# grep "loss is " net.log epoch:1 step:2990, loss is 1.4842823 epcoh:2 step:2990, loss is 1.0897788 ...
模型检查点保存在当前目录下。
训练结束后,您可在默认
./train/
脚本文件夹下找到检查点文件。
-
在Ascend环境运行时评估数据集
sh run_eval_ascend.sh \ /home/workspace/atae_lstm/data/ \ /home/workspace/atae_lstm/train/atae-lstm_max.ckpt
上述python命令将在后台运行,您可以通过eval.log文件查看结果。测试数据集的准确性如下:
# grep "accuracy:" eval.log accuracy:{'acc':0.8253}
可以使用如下命令导出mindir文件
python export.py --existed_ckpt="./train/atae-lstm_max.ckpt" \
--word_path="./data/weight.npz"
在执行推理之前,需要通过export.py导出mindir文件。输入文件为bin格式。
# 文件预处理
python preprocess.py --data_path="./data/test.mindrecord"
# Ascend310 推理
bash run_infer_310.sh [MINDIR_PATH] [DATASET_PATH] [DEVICE_TARGET] [DEVICE_ID]
DEVICE_TARGET
可选值范围为:['GPU', 'CPU', 'Ascend'];
DEVICE_ID
可选, 默认值为0.
推理结果保存在当前路径,可在acc.log中看到最终精度结果。
参数 | Ascend |
---|---|
资源 | Ascend 910;CPU 2.60GHz,192核;内存 755G;系统 Euler2.8 |
上传日期 | 2021-12-11 |
MindSpore版本 | 1.5.0 |
数据集 | SemEval 2014 task4 |
训练参数 | epoch=25, step=2990, batch_size=1, lr=0.0125 |
优化器 | Momentum |
参数(M) | 2.68 |
微调检查点 | 26M |
推理模型 | 9.9M(.air文件)、11M(.mindir文件) |
在train.py和eval.py中,我们设置了随机种子。
请浏览官网主页。