1. 确定了(状态,动作,奖励,下一状态,对话是否结束)的组成,即训练数据:
状态:每次的状态针对于用户说完一句话
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{
'agent_action': { # 针对于agent的话
'request_slots':{},
'turn': 0, # agent的话所在的轮次,从0开始
'speaker': 'agent',
'inform_slots': {},
'diaact': 'request'
},
'user_action': {
'request_slots':{},
'turn': 0,
'speaker': 'user',
'inform_slots': {},
'diaact': 'request'
},
'turn': 1, # 从1开始,每次加2
'current_slots': {
'request_slots': {}, # 当前状态下所有未知的slot
'agent_request_slots': {}, # agent问过的所有slot
'inform_slots': {}, # 当前状态下所有已知的slot
},
'history': [ # 存储用户和agent的历史记录
{
'request_slots':{},
'turn': 1
'speaker': 'user',
'inform_slots': {},
'diaact': 'request'
},
{
'request_slots':{},
'turn': 1
'speaker': 'user',
'inform_slots': {},
'diaact': 'request'
}
]
}动作:针对于当前的状态,agent下一时刻所要采取的动作
1
2
3
4
5
6
7
8
9{
'act_slot_response': {
'request_slots': {},
'turn': 1,
'diaact': '',
'inform_slots': {},
'nl': '', # 当前状态对应下一时刻agent的输出
}
}奖励:对话成功,奖励为2*max_turn;对话失败,奖励为-max_turn
下一状态:用户的下一句话
对话是否结束:当前状态是否为对话的最后一句话
2. 确定了动作集的表示
- 动作集是指用户状态所对应的动作的集合,DQN的目的就是根据当前状态,从该动作集中选择一个Q值最大的动作
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# 之后可能会补充
feasible_actions = [
{'diaact': "request", 'inform_slots': {}, 'request_slots': {'child_name': 'UNK'}},
{'diaact': "request", 'inform_slots': {}, 'request_slots': {'client_name': 'UNK'}},
{'diaact': "request", 'inform_slots': {}, 'request_slots': {'phone_number': 'UNK'}},
{'diaact': "request", 'inform_slots': {}, 'request_slots': {'child_age': 'UNK'}},
{'diaact': "request", 'inform_slots': {}, 'request_slots': {'client_gender': 'UNK'}},
{'diaact': "request", 'inform_slots': {}, 'request_slots': {'english_level': 'UNK'}},
{'diaact': "request", 'inform_slots': {}, 'request_slots': {'client_location': 'UNK'}},
{'diaact': "request", 'inform_slots': {}, 'request_slots': {'reserve_location': 'UNK'}},
{'diaact': "request", 'inform_slots': {}, 'request_slots': {'reserve_time': 'UNK'}},
{'diaact': "request", 'inform_slots': {'fee': 'PLACEHOLDER'}, 'request_slots': {'child_name': 'UNK'}},
{'diaact': "request", 'inform_slots': {'teacher_nation': 'PLACEHOLDER'}, 'request_slots': {'child_name': 'UNK'}},
{'diaact': "request", 'inform_slots': {'online_course': 'PLACEHOLDER'}, 'request_slots': {'child_name': 'UNK'}},
{'diaact': "request", 'inform_slots': {'reserve_location': 'PLACEHOLDER'}, 'request_slots': {'phone_number': 'UNK'}},
{'diaact': "request", 'inform_slots': {'fee': 'PLACEHOLDER'}, 'request_slots': {'phone_number': 'UNK'}},
{'diaact': "request", 'inform_slots': {'teacher_nation': 'PLACEHOLDER'}, 'request_slots': {'phone_number': 'UNK'}},
{'diaact': "request", 'inform_slots': {'online_course': 'PLACEHOLDER'}, 'request_slots': {'phone_number': 'UNK'}},
{'diaact': "request", 'inform_slots': {'fee': 'PLACEHOLDER'}, 'request_slots': {'client_gender': 'UNK'}},
{'diaact': "request", 'inform_slots': {'fee': 'PLACEHOLDER'}, 'request_slots': {'child_age': 'UNK'}},
{'diaact': "request", 'inform_slots': {'online_course': 'PLACEHOLDER'}, 'request_slots': {'english_level': 'UNK'}},
{'diaact': "request", 'inform_slots': {'fee': 'PLACEHOLDER'}, 'request_slots': {'client_location': 'UNK'}},
{'diaact': "request", 'inform_slots': {'fee': 'PLACEHOLDER'}, 'request_slots': {'client_name': 'UNK'}},
{'diaact': "request", 'inform_slots': {'fee': 'PLACEHOLDER'}, 'request_slots': {'child_grade': 'UNK'}},
{'diaact': "request", 'inform_slots': {'class_type': 'PLACEHOLDER'}, 'request_slots': {'phone_number': 'UNK'}},
{'diaact': "request", 'inform_slots': {'fee': 'PLACEHOLDER'}, 'request_slots': {'english_level': 'UNK'}},
{'diaact': "request", 'inform_slots': {'school_location': 'PLACEHOLDER'}, 'request_slots': {'reserve_location': 'UNK'}},
{'diaact': "request", 'inform_slots': {'fee': 'PLACEHOLDER'}, 'request_slots': {'client_location': 'UNK'}},
{'diaact': "inform", 'inform_slots': {'fee': 'PLACEHOLDER'}, 'request_slots': {}},
{'diaact': "inform", 'inform_slots': {'teacher_nation': 'PLACEHOLDER'}, 'request_slots': {}},
{'diaact': "inform", 'inform_slots': {'online_course': 'PLACEHOLDER'}, 'request_slots': {}},
{'diaact': "inform", 'inform_slots': {'school_location': 'PLACEHOLDER'}, 'request_slots': {}},
{'diaact': "inform", 'inform_slots': {'class_type': 'PLACEHOLDER'}, 'request_slots': {}}
]
3. 从原始对话中提取出(状态,动作,奖励,下一状态,对话是否结束)五元组,作为训练数据
- 主要使用规则的nlu来处理,因此提取的五元组可能会有一些错误,需要人工改正
4. 重写了之前电影推荐的代码,使用提取的五元组来训练我们自己的DQN网络,目前代码已经调试完成,我们用小规模数据验证了整个流程的可行性
5. 下周计划
- 更正提取到的所有五元组
- 使用更正后的训练数据来训练DQN网络,测试对话的成功率
- 根据上述成功率来对网络的参数作相应的改变,提高正确率
- 查阅针对于强化学习策略改进的论文,试着借鉴一些新的方法