目录
介绍
背景
使用代码
兴趣点
介绍XOR或“异或”问题是ANN研究中的经典问题。
在给定两个二进制输入的情况下,使用神经网络预测XOR逻辑门的输出是一个问题。
如果两个输入不相等,XOR函数应该返回一个真值,如果它们相等则返回一个假值。
有许多不同的方法可以解决XOR问题。其中一些基于声明性方法,一些基于命令式方法,如神经网络等。
在本文中,我们将尝试使用一种组合方法来解决XOR问题。
这种方法也可以用来解决不同的搜索问题。
背景为了使用这种方法,我们需要一些先决条件。
首先,我们需要为特定输入定义所需的输出,所以让我们为此定义一个数据结构。
var thought = new Thought
{
Decisions = new List
{
new Decision
{
Answer = "True",
Id =1,
Symbols = new List{new Symbol { Word = "1"},
new Symbol { Word = "1" } }
},
new Decision
{
Answer = "False",
Id = 2,
Symbols = new List{new Symbol { Word = "1"},
new Symbol { Word = "0" } }
},
new Decision
{
Answer = "True",
Id = 3,
Symbols = new List{new Symbol { Word = "0"},
new Symbol { Word = "0" } }
},
new Decision
{
Answer = "False",
Id = 4,
Symbols = new List{new Symbol { Word = "0"},
new Symbol { Word = "1" } }
}
}
};
在这里,我们定义了一个思想类。此类表示具有决策列表的逻辑容器。
每个决定代表一个取决于输入的答案,这个想法应该产生一个有效的决定。
使用代码在我们可以使用我们的思想之前,我们需要训练它的决定。
当思想产生时,决策中的所有权重都是随机分布的。
1、使用随机正态分布随机化权重:
thought.Decisions.ForEach(x => x.ResetWeights());
2、现在我们需要训练我们的思想:
thought.Reinforce(new[] { "0", "0" }, 3);
thought.Reinforce(new[] { "1", "0" }, 2);
thought.Reinforce(new[] { "0", "1" }, 4);
thought.Reinforce(new[] { "1", "1" }, 1);
在训练过程中,我们提供输入和所需的决策ID作为输出。
训练本身用循环和预定义的迭代次数表示。
迭代次数被定义为Decisions.Count * 1300;其中1300是启发式定义的常数。
在循环内部,我们尝试计算输出分数的差异并将其传播到目标决策。
使用以下公式计算目标决策的更新增量:
var updateDelta = MathUtils.Derivative(answer.Score) *
targetDecision.Delta * targetAnswer.Score;
如果我们决定构建一个两层神经网络,这非常相似。
计算出delta后,我们将其应用于方法内的决策符号:
public void UpdateWeights() {
Bias += Delta;
foreach (var symbol in Symbols) {
symbol.Weight += Delta;
}
}
训练完成后,我们可以向训练有素的思想询问答案:
要从思想中得到答案,首先我们需要找到输入符号和决策符号之间的匹配。
然后是一些权重并将其传递给一些激活函数(在我们的例子中,这是一个sigmoid函数)。
public double Stimulate(string[] words) {
var matchedSymbols = Symbols.Where(s => words.Contains(s.Word));
var score = matchedSymbols.Sum(x => x.Weight) + Bias;
return MathUtils.Sigmoid(score);
}
所描述的方法可以很容易地适用于解决各种搜索问题。
您可以在Github上找到示例的完整源代码:
- GitHub - pashkovdenis/dynamicweightexample: Example of solving XOR problem using dynamic weights
https://www.codeproject.com/Tips/5322172/Solving-XOR-Problem-using-Dynamic-Weights