-
Notifications
You must be signed in to change notification settings - Fork 5.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
修改seqToseq的目标函数(cost function) #1104
Comments
我尝试和trg_embedding一样,直接将a传入到recurrent_group的input中:
相应地,在gru_decoder_with_attention中也添加了a变量 结果报错: 我把a改成SubsequenceInput,也有问题: 我看了下layers.py中对应位置,应该是因为: |
另外,为了使用simple_attention中的attention_weight,我修改了networks.py中的simple_attention返回值,将attention_weight也返回了: 然后在seqToseq_net.py中调用simple_attention的位置定义了attention_weight: 我是打算在gru_decoder_with_attention中计算a和attention_weight的cost,然后作为返回值和out变量(即softmax)一起传出去。不知道这样理解对吗? |
@coollip 你好~ 对流程的理解,大致是没有问题的。 先说结论,你需要的模型如果不修改Paddle的 C++ 代码,无法通过配置直接配出来。 下面是关于上面提到的 4 个问题。
|
@lcy-seso
|
主要是修改RecurrentGradientMachine.cpp,AgentLayer.cpp相关的,这部分还是比较复杂的。 |
@coollip 下午写了一半,我大致解释一下 recurrent_layer_group 的流程和现在的一些限制。
|
@coollip 如果你需要改代码,可能有点麻烦,需要改 AgentLayer.cpp,让 attention weight 这个 layer 可以出 layer_group 。。。我们再想想这个问题。 |
@lcy-seso ,谢谢你的详细回答。 你提到说: 那把trg_ids改为integer_value_sub_sequence是否可行,比如把trg_ids=[1,3,2,15]这种integer_value_sequence改成下面的格式: ` decoder = recurrent_group(name=decoder_group_name,
这样,在gru_decoder_with_attention中拿到解码端当前时刻的current_word和a,其中current_word是[1]这种形式,a是长度为src len的序列。 这样运行也不行,看来我的理解还是不对。目前只能暂时搁置尝试了。。。 |
把 target embedding 变成 subsequence 也是不可以的。 解决了 ”拿进来“的问题。然后,是想在layer group 里面用math 计算 MSE 吗?到这一步都可以做到,算完也可以直接拿出 layer_group 。但是。。这时候没办法再接 cost layer 了。网络必须以cost layer 作为末端。 如果只是拿进来。。因为输出对长度也有限制,会拿不出layer_group。(”拿进来“和 ”拿出去“这两部里都有一些重组batch 的操作,所以对输入输出长度会有限制)。 结论就是。。不改代码。。配不出来。。 |
@lcy-seso 好的,谢谢回复哈 |
@coollip 这个配置我再想想,怎么样有可能比较简单的解决。谢谢你的关注啊 ~ |
I close this issue due to inactivity. please feel free to reopen it if more information is available. |
* modify transforner-rst * modify roformer tokenizer * modify roformer model * update * modify transformer * modify roformer modeling * modify decoder * update * modify tokenizer * modify token_embedding
* update auto compression docs * fix readme * fix title
Hi,我之前试用过demo中的seqToseq示例,成功训练了机器翻译nmt模型,工作正常。
最近看了一篇将align信息引入到cost function中的论文:
Wenhu Chen, “guided alignment training for topic-aware neural machine translation”.
这篇论文的思路其实比较简单:
seqToseq中的attention可以看做对齐信息,但这个对齐没有fast align的强对齐效果好,作者希望模型在训练过程中能够参考fast align的强对齐结果,对attention进行调整。基于这个思路,作者先在线下用fast align对语料进行了对齐,然后定义了fast align结果和网络attention之间的cost,将其加入到cross entropy的cost中,即:
其中:
HD就是目前seqToseq demo中使用的cross entropy
G是作者定义的align cost。
可以看到,最后cost function是HD和G两者的加权和。w1、w2控制了两者的比例。
G作为align cost,其实就是mean squared error。G中的A是二维矩阵,即fast align的对齐结果,Ati是target sentence第t个token和src sentence第i个token的对齐情况,若fast align的结果认为这两者是对齐的,则Ati被置为1(实际计算时会对A进行归一化,使得每一行的和是1)。
alpha则是网络中的attention。
OK,上面说完了背景,现在说说我怎么在paddle中尝试实现这一方案。
首先用fast align对语料做了对齐,为每个sentence pair生成了对应的A,A的行数为该pair中target sentence的token数,A的列数为src sentence的token数。根据fast align的结果,将A中相应的位置置为1,最后再对每一行进行了归一化。
完成1后,就要将A作为训练信息通过dataprovider传入到paddle中。
由于后面要计算A和attention的align cost,所以我先看了下demo中的attention,其代码在simple_attention中:
attention_weight = fc_layer(input=m, size=1, act=SequenceSoftmaxActivation(), param_attr=softmax_param_attr, name="%s_softmax" % name, bias_attr=False)
我的理解是:simple_attention方法在解码端每个time step都会执行一次,在当前t时刻时,这里的attention_weight是一个序列,序列长度是当前sentence pair的src len,序列中每个元素是一个一维的浮点数,第i个元素表示当前解码时刻t的target token和src第i个token的attention值。
相应地,我也将fast align的结果A设置为类似的格式,采用了
dense_vector_sub_sequence(1)
这种格式,假设训练样本sentence pair的src包含3个token,target包含2个token,则A的形式举例如下:
[
[ [0.5],[0.5],[0] ], //target第1个token和src每个token的对齐结果
[ [0],[0.5],[0.5] ], //target第2个token和src每个token的对齐结果
]
我按照这种格式将A传进了paddle,具体如下:
`
a = data_layer(name='target_source_align', size=1)
`
现在我有几个问题:
The text was updated successfully, but these errors were encountered: