关于如何让神经网络学习如何将序列拆分为子序列的想法

人工智能 神经网络 算法
2021-10-31 21:00:12

如何训练神经网络识别序列流中的子序列?

例如:给定序列111100002222作为流中的输入样本,神经网络将识别出111100002222是子序列(因此111100不是有效的子序列),依此类推,大约有 50 到 100 个不同的子序列。

子序列在流中出现的顺序没有特定的顺序。没有网络架构限制。子序列的长度可变。

欢迎一般概念、想法和理论。

4个回答

原始问题中的问题类似于归纳上下文相关文法(CSL) 的问题,只是它更难,因为假设 CSL 由固定长度的子序列组成。它可能更接近于诱导Reber 语法的问题,但这反过来又显得有点矫枉过正。

众所周知,LSTM 能够学习CSLReber语法。但是,由于以下评论,我怀疑这是否是您真正需要的:

[...] 给定一本书,其中任何地方都没有空格,只有字符(包括特殊字符,如逗号),我们可以通过什么方式让网络学习这本书的“单词边界”。

这称为形态归纳,它比简单的 Reber 语法归纳困难得多。请注意,寻找词的边界是寻找词素边界问题的一个特例。已经有很多 尝试解决这个问题有关更多详细信息和参考资料,请参阅调查论文)。

大多数开发的方法似乎都依赖于统计原理(如MDL),并且使用神经网络(使用 LSTM的反例)。我的直觉是,跨语言的极端形态变异性(从具有高度屈折形态的芬兰-乌戈尔语到几乎没有任何形态的汉藏语)使得以与语言无关的方式训练神经网络变得困难。但是,如果您专注于单一语言,您可能会获得更好的运气。

希望有帮助。

我想,监督学习应该会很好地工作:你会为网络提供一个固定的子字符串,它会确定中间字符是单词的第一个字母,还是最后一个字母,或者两者都不是。

所以2*n+1输入(例如,用字符串“ingsits”输入)应该在输出上输出一个 1,确定中间字母(这里:“s”)是否是单词的第一个,输出上一个 0,确定它是否是最后一个一个(取自“Thekingsitsthere”)。每个输入字符可能应该是 1 次热编码。

您可能希望使用比我的示例更多的上下文字符。OTOH,您可以使用没有时间并发症的简单 MLP。它永远不会变得完美,因为它是不可能的,但它已经非常接近了。

关于无监督学习,我持怀疑态度......

(注意:我认为没有人工神经网络会更容易......)

但如果你坚持:

  1. 将序列转换为固定大小的向量。
  2. 推入一个 2-5 1D 卷积层,最后有 1 个神经元密集层(sigmoid 激活)和另一个 K 点检测器,用于获取序列断裂点
  3. 创建一个训练集 - 在序列中找到断点 (12, 23, 34 ...)。
  4. 使用 SGD 训练检测器以找到这些断点。- 损失函数:cross_entropy。

然后,它应该学会找到断点,并在此基础上轻松拆分序列。

另一种方法可能是预测序列的类别而不是断点。假设每个序列都是一个类的一部分,您可以使用 LSTM。输入多个序列 (111100002222 ) 并预测每个序列的类别 (c1,c1,c1,c1,c0,c0,c0,c0,c2,c2,c2,c2)