如何训练神经网络识别序列流中的子序列?
例如:给定序列111100002222作为流中的输入样本,神经网络将识别出1111、0000、2222是子序列(因此111100不是有效的子序列),依此类推,大约有 50 到 100 个不同的子序列。
子序列在流中出现的顺序没有特定的顺序。没有网络架构限制。子序列的长度可变。
欢迎一般概念、想法和理论。
如何训练神经网络识别序列流中的子序列?
例如:给定序列111100002222作为流中的输入样本,神经网络将识别出1111、0000、2222是子序列(因此111100不是有效的子序列),依此类推,大约有 50 到 100 个不同的子序列。
子序列在流中出现的顺序没有特定的顺序。没有网络架构限制。子序列的长度可变。
欢迎一般概念、想法和理论。
原始问题中的问题类似于归纳上下文相关文法(CSL) 的问题,只是它更难,因为假设 CSL 由固定长度的子序列组成。它可能更接近于诱导Reber 语法的问题,但这反过来又显得有点矫枉过正。
众所周知,LSTM 能够学习CSL和Reber语法。但是,由于以下评论,我怀疑这是否是您真正需要的:
[...] 给定一本书,其中任何地方都没有空格,只有字符(包括特殊字符,如逗号),我们可以通过什么方式让网络学习这本书的“单词边界”。
这称为形态归纳,它比简单的 Reber 语法归纳要困难得多。请注意,寻找词的边界是寻找词素边界问题的一个特例。已经有很多 尝试来解决这个问题(有关更多详细信息和参考资料,请参阅此调查论文)。
大多数开发的方法似乎都依赖于统计原理(如MDL),并且不使用神经网络(使用 LSTM的反例)。我的直觉是,跨语言的极端形态变异性(从具有高度屈折形态的芬兰-乌戈尔语到几乎没有任何形态的汉藏语)使得以与语言无关的方式训练神经网络变得困难。但是,如果您专注于单一语言,您可能会获得更好的运气。
希望有帮助。
我想,监督学习应该会很好地工作:你会为网络提供一个固定的子字符串,它会确定中间字符是单词的第一个字母,还是最后一个字母,或者两者都不是。
所以2*n+1
输入(例如,用字符串“ingsits”输入)应该在输出上输出一个 1,确定中间字母(这里:“s”)是否是单词的第一个,输出上一个 0,确定它是否是最后一个一个(取自“Thekingsitsthere”)。每个输入字符可能应该是 1 次热编码。
您可能希望使用比我的示例更多的上下文字符。OTOH,您可以使用没有时间并发症的简单 MLP。它永远不会变得完美,因为它是不可能的,但它已经非常接近了。
关于无监督学习,我持怀疑态度......
(注意:我认为没有人工神经网络会更容易......)
但如果你坚持:
然后,它应该学会找到断点,并在此基础上轻松拆分序列。
另一种方法可能是预测序列的类别而不是断点。假设每个序列都是一个类的一部分,您可以使用 LSTM。输入多个序列 (111100002222 ) 并预测每个序列的类别 (c1,c1,c1,c1,c0,c0,c0,c0,c2,c2,c2,c2)