ELMoForManyLangs icon indicating copy to clipboard operation
ELMoForManyLangs copied to clipboard

相同输入下结果不同

Open jingshu-liu opened this issue 6 years ago • 13 comments

e = Embedder(path) sents = [['Sam', 'goes', 'to', 'the', 'bank', 'every', 'day', '.']]

res1 = e.sents2elmo(sents) res2 = e.sents2elmo(sents)

jingshu-liu avatar Feb 28 '19 16:02 jingshu-liu

雾草。。确实,每一次call都不一样

allanj avatar Mar 27 '19 13:03 allanj

可能是inference的时候,dropout参数没有重置为0

numb3r3 avatar Apr 08 '19 08:04 numb3r3

可能是inference的时候,dropout参数没有重置为0

这就尴尬了

allanj avatar Apr 08 '19 08:04 allanj

可能是inference的时候,dropout参数没有重置为0

e = Embedder(path) 在创建的时候已经 设置了 eval()模式, 我看了所有子模型的dropout也的确都是0

jingshu-liu avatar Apr 08 '19 08:04 jingshu-liu

@Liujish931 我看了一下具体代码,只有frontend.py里面的定义的model设置了eval()模式。但是真正做inference的model, .modules.elmo.ElmobiLm 没有设置eval()模式。所以应该还是在inference的时候做了dropout

创建模型的get_model() 里面最后有model.eval(), modules.elmo.ElmobiLm只是整个模型的子模型 所以也会被设置为0 而且你可以运行的时候看 的确所有的dropout都是0

没错 eval() 会影响所有子模型的dropout和 batch normalisation, pytorch doc里有

jingshu-liu avatar Apr 08 '19 08:04 jingshu-liu

@Liujish931 我看了一下具体代码,只有frontend.py里面的定义的model设置了eval()模式。但是真正做inference的model, .modules.elmo.ElmobiLm 没有设置eval()模式。所以应该还是在inference的时候做了dropout

创建模型的get_model() 里面最后有model.eval(), modules.elmo.ElmobiLm只是整个模型的子模型 所以也会被设置为0 而且你可以运行的时候看 的确所有的dropout都是0

没错 eval() 会影响所有子模型的dropout和 batch normalisation, pytorch doc里有

那相同输入,输出却不同的真正原因是什么呢?

a101269 avatar Apr 17 '19 13:04 a101269

想问一下大家。不同的输出结果对你们有影响吗

----- 后来发现其实官方的elmo也是会变化的。

allanj avatar Apr 19 '19 16:04 allanj

想问一下大家。不同的输出结果对你们有影响吗

----- 后来发现其实官方的elmo也是会变化的。 影响很大

a101269 avatar Apr 25 '19 09:04 a101269

想问一下大家。不同的输出结果对你们有影响吗 ----- 后来发现其实官方的elmo也是会变化的。 影响很大

这就太特么尬了。

scofield7419 avatar Aug 19 '19 13:08 scofield7419

其实还好。我感觉对我NER没什么太大影响

allanj avatar Aug 19 '19 15:08 allanj

这个你们解决了吗

YC-wind avatar May 18 '20 16:05 YC-wind

@Liujish931 我看了一下具体代码,只有frontend.py里面的定义的model设置了eval()模式。但是真正做inference的model, .modules.elmo.ElmobiLm 没有设置eval()模式。所以应该还是在inference的时候做了dropout

创建模型的get_model() 里面最后有model.eval(), modules.elmo.ElmobiLm只是整个模型的子模型 所以也会被设置为0 而且你可以运行的时候看 的确所有的dropout都是0 没错 eval() 会影响所有子模型的dropout和 batch normalisation, pytorch doc里有

那相同输入,输出却不同的真正原因是什么呢? 真正的原因是在/ELMoForManyLangs/elmoformanylangs/modules/elmo.py 102行 有这么一条语句:self._update_states(final_states, restoration_indices) 将上一轮运算的 final_state作为下一次运算的 initial_states 这样会导致两次 elmo运算的 initial_states 不一致所以结果不一致。 不过不太清楚这么做的意义在哪儿,希望大神给个解答

LChanger avatar May 21 '20 08:05 LChanger

@Liujish931 我看了一下具体代码,只有frontend.py里面的定义的model设置了eval()模式。但是真正做inference的model, .modules.elmo.ElmobiLm 没有设置eval()模式。所以应该还是在inference的时候做了dropout

创建模型的get_model() 里面最后有model.eval(), modules.elmo.ElmobiLm只是整个模型的子模型 所以也会被设置为0 而且你可以运行的时候看 的确所有的dropout都是0 没错 eval() 会影响所有子模型的dropout和 batch normalisation, pytorch doc里有

那相同输入,输出却不同的真正原因是什么呢? 真正的原因是在/ELMoForManyLangs/elmoformanylangs/modules/elmo.py 102行 有这么一条语句:self._update_states(final_states, restoration_indices) 将上一轮运算的 final_state作为下一次运算的 initial_states 这样会导致两次 elmo运算的 initial_states 不一致所以结果不一致。 不过不太清楚这么做的意义在哪儿,希望大神给个解答

我能想到的是应该是训练的时候读的是document-level, 上下句(文)有联系吧

fe1ixxu avatar Oct 01 '20 20:10 fe1ixxu