README.md 4.9 KB
Newer Older
O
overlordmax 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
# DSSM

```
├── README.md			 # 文档
├── dssm.py				 # dssm网络结构
├── args.py				 # 参数脚本
├── infer.py			 # 预测脚本
├── train_gpu.sh		 # gpu训练shell脚本
├── train_cpu.sh		 # cpu训练shell脚本
├── infer_gpu.sh		 # gpu预测shell脚本
├── infer_cpu.sh		 # cpu预测shell脚本
```

## 简介

DSSM[《Learning Deep Structured Semantic Models for Web Search using Clickthrough Data》](  https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/cikm2013_DSSM_fullversion.pdf  )即基于深度网络的语义模型,其核心思想是将query和doc映射到共同维度的语义空间中,通过最大化query和doc语义向量之间的余弦相似度,从而训练得到隐含语义模型,达到检索的目的,并通过word hashing方法来减少输入向量的维度。DSSM有很广泛的应用,比如:搜索引擎检索,广告相关性,问答系统,机器翻译等。

本项目按照论文的网络结构在paddlepaddle上实现DSSM模型,并构造数据集验证网络的正确性。

## 环境

 PaddlePaddle 1.7.0 

 python3.7 

## 单机训练

GPU环境

在train_gpu.sh脚本文件中设置好参数。

```sh
CUDA_VISIBLE_DEVICES=0 python dssm.py --use_gpu 1 \ #使用gpu
                                   --batch_size 16 \ #batch大小
                                   --TRIGRAM_D 1000 \ #输入向量维度
                                   --L1_N 300 \ #第一层mlp大小
                                   --L2_N 300 \ #第二层mlp大小
                                   --L3_N 128 \ #第三层mlp大小
                                   --Neg 4 \ #负采样个数
                                   --base_lr 0.01 \ #学习率
                                   --model_dir 'model_dir' #模型保存路径
```

修改脚本的可执行权限并运行

```shell
./train_gpu.sh
```

CPU环境

在train_cpu.sh脚本文件中设置好参数。

```sh
python dssm.py --use_gpu 0 \ #使用cpu
                --batch_size 16 \ #batch大小
                --TRIGRAM_D 1000 \ #输入向量维度
                --L1_N 300 \ #第一层mlp大小
                --L2_N 300 \ #第二层mlp大小
                --L3_N 128 \ #第三层mlp大小
                --Neg 4 \ #负采样个数
                --base_lr 0.01 \ #学习率
                --model_dir 'model_dir' #模型保存路径
```

修改脚本的可执行权限并运行

```
./train_cpu.sh
```

# 预测

GPU环境

在infer_gpu.sh脚本文件中设置好参数。

```sh
CUDA_VISIBLE_DEVICES=0 python infer.py --use_gpu 1 \ #使用gpu
                                        --model_dir 'model_dir' #模型路径
```

修改脚本的可执行权限并运行

```sh
./infer_gpu.sh
```

CPU环境

在infer_cpu.sh脚本文件中设置好参数。

```sh
python infer.py --use_gpu 0 \ #使用cpu
               --model_dir 'model_dir' #模型路径
```

修改脚本的可执行权限并运行

```
./infer_cpu.sh
```



## 模型效果

随机构造4个负样本进行训练,可见loss达到收敛状态。

```txt
W0422 15:36:37.033936  1627 device_context.cc:237] Please NOTE: device: 0, CUDA Capability: 70, Driver API Version: 9.2, Runtime API Version: 9.0
W0422 15:36:37.039381  1627 device_context.cc:245] device: 0, cuDNN Version: 7.3.
2020-04-22 15:36:38,718-INFO: epoch_id: 0, batch_time: 0.02135s, loss: 25.05417
2020-04-22 15:36:38,734-INFO: epoch_id: 1, batch_time: 0.01645s, loss: 16.14477
2020-04-22 15:36:38,750-INFO: epoch_id: 2, batch_time: 0.01573s, loss: 12.89269
2020-04-22 15:36:38,766-INFO: epoch_id: 3, batch_time: 0.01551s, loss: 11.51237
2020-04-22 15:36:38,785-INFO: epoch_id: 4, batch_time: 0.01890s, loss: 10.70215
......

2020-04-22 15:36:40,267-INFO: epoch_id: 95, batch_time: 0.01512s, loss: 7.13324
2020-04-22 15:36:40,282-INFO: epoch_id: 96, batch_time: 0.01502s, loss: 7.14063
2020-04-22 15:36:40,298-INFO: epoch_id: 97, batch_time: 0.01506s, loss: 7.13577
2020-04-22 15:36:40,314-INFO: epoch_id: 98, batch_time: 0.01512s, loss: 7.13683
2020-04-22 15:36:40,329-INFO: epoch_id: 99, batch_time: 0.01519s, loss: 7.13883
```

预测阶段可算出query和doc的相似度

```txt
W0422 15:40:16.847975  1752 device_context.cc:237] Please NOTE: device: 0, CUDA Capability: 70, Driver API Version: 9.2, Runtime API Version: 9.0
W0422 15:40:16.853554  1752 device_context.cc:245] device: 0, cuDNN Version: 7.3.
2020-04-22 15:40:18,589-INFO: query_doc_sim: 0.99267
2020-04-22 15:40:18,593-INFO: query_doc_sim: 0.99123
2020-04-22 15:40:18,596-INFO: query_doc_sim: 0.99198
2020-04-22 15:40:18,599-INFO: query_doc_sim: 0.99010
2020-04-22 15:40:18,602-INFO: query_doc_sim: 0.98832
......
2020-04-22 15:40:18,854-INFO: query_doc_sim: 0.99079
2020-04-22 15:40:18,857-INFO: query_doc_sim: 0.98585
2020-04-22 15:40:18,860-INFO: query_doc_sim: 0.98702
2020-04-22 15:40:18,863-INFO: query_doc_sim: 0.99151
2020-04-22 15:40:18,867-INFO: query_doc_sim: 0.98917
```