trainingData=ResourceData["MNIST","TrainingData"];
testData=ResourceData["MNIST","TestData"];

RandomSample[trainingData,10]

net = NetInitialize@NetChain[{
FlattenLayer[],
LinearLayer[500],
ElementwiseLayer["Sigmoid"],
LinearLayer[100],
ElementwiseLayer["Sigmoid"],
LinearLayer[10],
SoftmaxLayer[]},
"Input" -> NetEncoder[{"Image",{12,12},"ColorSpace"->"Grayscale"}],
"Output" -> NetDecoder[{"Class",Range[0,9]}]]

net[]

trained[]

trained = NetTrain[net, trainingData,ValidationSet->testData,MaxTrainingRounds->50 ]

measurements = ClassifierMeasurements[trained,testData]

measurements["Accuracy"]

measurements["WorstClassifiedExamples"]

NetMeasurements[trained,testData,"ConfusionMatrixPlot"]

graphNeuralLayer[{5,10,20,10}]

NetMeasurements[trained,testData,"ConfusionMatrixPlot"]

graphNeuralLayer[layer_List] :=
Module[{indexGraph,foldVertex, graph,input,output,vertexLabels,
inputVertexLabels,outputVertexLabels},
foldVertex = FoldList[Plus, 1,layer[[;;-3]]];
input = layer[[1]];
output = layer[[-1]];
inputVertexLabels = Table[i -> Placed[(Subscript[X, i]),Center],{i, 1, input}];
outputVertexLabels = Table[i -> Placed[(Subscript[Y, i - Plus@@layer[[;;-2]]]), Center],
{i, Plus@@layer[[;;-2]] + 1,Plus@@layer[[;;-2]] + output}];
vertexLabels = Join[inputVertexLabels,outputVertexLabels];
indexGraph = MapThread[IndexGraph,
{CompleteGraph /@ Partition[layer, 2,1],
foldVertex}];
graph = GraphUnion @@ indexGraph ;
Graph[graph,
GraphLayout->{"MultipartiteEmbedding","VertexPartition"-> layer},
VertexLabels-> vertexLabels,
VertexSize->0.8]]

graphNeuralLayer[{5,20,10,15,10,5,2}]

graphNeuralLayer[{3,5,2}]

输出神经元 y , 目标值 t  对平方差求和得到误差函数 networkE(ω)函数，ω为网络层权重, N 为输出神经元个数，L为输入神经元个数，t 为实际目标值，y为神经网络加权计算所得到的值，g 为限定函数。

(Subscript[y, k])= (∑_(i=0)^L)g[(Subscript[ω, ik]) (Subscript[x, i])]// TraditionalForm;

E[ω] ==  (1/2)(∑_(k=1)^N)((Subscript[y, k])- (Subscript[t, k]))^2

E[ω]==(1/2) (∑_(k=1)^N)(((-(Subscript[t, k])+(∑_(i=0)^L)g((Subscript[x, i]) (Subscript[ω, ik]))))^2)

E[ω] ==  (1/2)(∑_(k=1)^N)((Subscript[y, k])- (Subscript[t, k]))^2// TraditionalForm

E(ω)==(1/2) (∑_(k=1)^N)((((∑_(i=0)^L)g((Subscript[x, i]) (Subscript[ω, ik]))-(Subscript[t, k])))^2)

error 函数对 ω求偏导数

((∂E)/(∂(Subscript[ω, τk])))==(∂/(∂(Subscript[ω, τk])))((1/2)(∑_(k=1)^N)(((-(Subscript[t, k])+(∑_(i=1)^L)g((Subscript[x, i]) (Subscript[ω, ik]))))^2))==(1/2)*(∑_(k=1)^N)2*(-(Subscript[t, k])+(∑_(i=1)^L)g((Subscript[x, i]) (Subscript[ω, ik])))(∂/(∂(Subscript[ω, τk])))(-(Subscript[t, k])+(∑_(i=1)^L)g((Subscript[x, i]) (Subscript[ω, ik])))==(∑_(k=1)^N)((Subscript[y, k])-(Subscript[t, k]))(∂/(∂(Subscript[ω, τk])))(-(Subscript[t, k])+(∑_(i=1)^L)g((Subscript[x, i]) (Subscript[ω, ik])))==(∑_(k=1)^N)((Subscript[y, k])-(Subscript[t, k]))(-((∂(Subscript[t, k]))/(∂(Subscript[ω, τk])))+((∂(∑_(i=1)^L)g((Subscript[x, i])(Subscript[ω, ik])))/(∂(Subscript[ω, τk]))))

由于 t 与变量ω无关， 假设网络中没有限定函数 g则表达式计算成，(Subscript[ω, ik])与(Subscript[ω, τk])分别属于独立变量，所以只有当τ=i时((∂(Subscript[ω, ik]))/(∂(Subscript[ω, τk])))=1， 其他情况为0，由此得出:

((∂E)/(∂(Subscript[ω, τk])))==(∑_(k=1)^N)((Subscript[y, k])-(Subscript[t, k]))(-((∂(Subscript[t, k]))/(∂(Subscript[ω, τk])))+((∂(∑_(i=1)^L)(Subscript[x, i])(Subscript[ω, ik]))/(∂(Subscript[ω, τk]))))==(∑_(k=1)^N)((Subscript[y, k])-(Subscript[t, k]))*(Subscript[x, i])==(∑_(k=1)^N)((Subscript[t, k])-(Subscript[y, k]))(-(Subscript[x, τ]))

梯度下降理解

对于已知连续可微函数 f(x), 在x0处求导得到x0处切线的斜率f'(x0),假设切线的方程为 y(x) = kx + b,则根据x0的等式 f(x0) = f’(x0)*x0 + b, b = f(x0) - f’(x0) * x0, 由此可知 切线方程为 y(x) = f’(x0) * x + f(x0) - f’(x0) * x0 = f’(x0) * (x - x0) + f(x0)

1. 原函数方程 y=f(x)
2. 切线方程 y = f'(x0) * (x - x0) + f(x0)

考虑以下函数

f(x)=(x^(sin(x)))

Plot[{f[x]},{x,-10,10}]

With[
{x0 = 3, x1 = 7},
Plot[{
f[x],
f'[x0] (x - x0) + f[x0],
f'[x1] (x - x1) + f[x1]},
{x,-10,10},
PlotRange -> {-10, 10},
Epilog -> {
PointSize[Medium],
Point[{x0,f[x0]}],
Point[{x1,f[x1]}],
Text[{x0,f[x0]},Offset[{20,10},{x0,f[x0]}]],
Text[{x1,f[x1]},Offset[{20,10},{x1,f[x1]}]]},
PlotLegends->"Expressions"]]

考虑函数递增的情况，在x1 {7,7^Sinx(7)}点处的斜率为 f’(7) > 0，为了寻找f(x)的局部最小值我们可以变换 x = x1 - ηf’(x1), η为固定的修正值，然后我们根据迭代公式

(Subscript[x, i])=(Subscript[x, i-1])-(ηf)'((Subscript[x, i-1]))  逐渐向左逼近f(x)的局部极小值

考虑函数递减的情况，在x2 {3,3^Sinx(3)}点处的斜率为f’(3) < 0，为了寻找f(x)的局部最小值我们可以变换x = x2 -ηf’(x2), 最后我们根据迭代公式

(Subscript[x, i])=(Subscript[x, i-1])-(ηf)'((Subscript[x, i-1]))  逐渐向右逼近f(x)的局部极小值

由上述的结论我们可以将梯度下降理论应用神经网络中

((∂E)/(∂(Subscript[ω, τk]))) == (∑_(k=1)^N)((Subscript[t, k])-(Subscript[y, k]))(-(Subscript[x, τ]))

ωτκ -> ωτκ - η((Subscript[t, k])-(Subscript[y, k]))(-(Subscript[x, τ]))
ωτκ -> ωτκ + η((Subscript[t, k])-(Subscript[y, k]))(Subscript[x, τ])
应用梯度下降方法对ωτκ做如上变换，我们可以递归的找到E的极小值。

以上考虑的是神经网络没有隐藏层存在，且无限定函数，现在考虑网络中存在限定函数g，用来抑制神经元的输出。

graphNeuralLayer[{3,6,4}]

考虑如上所画的网络图，其中第一层是输入层，中间是隐藏层，最后输出层，假设第二层的权重为μ，第三层的权重为ω，α为隐藏层的输出，h 为输出神经元的输入，y为输出神经元的输出

((∂E)/(∂(Subscript[ω, ξk])))==((∂E)/(∂(Subscript[h, k])))((∂(Subscript[h, k]))/(∂(Subscript[ω, ξk])))
(Subscript[h, k]) == (∑_(j=0)^M)(Subscript[ω, jk])(Subscript[α, j])

(Subscript[α, j]) 为隐藏层的激活值， 由于ω是独立变量，并且(Subscript[α, j])与(Subscript[ω, ξk])相互独立，所以第二项偏导数除了ξ = j时 有贡献，其余都为0，所以采用链式求导法则

((∂(Subscript[h, k]))/(∂(Subscript[ω, ξk])))==((∂(∑_(j=0)^M)(Subscript[ω, jk])(Subscript[α, j]))/(∂(Subscript[ω, ξk])))==((∂(Subscript[ω, ξk])(Subscript[α, j]))/(∂(Subscript[ω, ξk])))==(Subscript[α, j])==(Subscript[α, ξ])

((∂E)/(∂(Subscript[h, k])))==(Subscript[δ, 0])[k]==((∂E)/(∂(Subscript[y, k])))((∂(Subscript[y, k]))/(∂(Subscript[h, k])))
(Subscript[y, k]) ==  g[(Subscript[h, k])] == g[(∑_(j=0)^M)(Subscript[ω, jk])(Subscript[α, j])]
(Subscript[δ, 0])[k] == ((∂E)/(∂(Subscript[h, k]))) == ((∂E)/(∂g[(Subscript[h, k])]))((∂g[(Subscript[h, k])])/(∂(Subscript[h, k]))) == ((∂E)/(∂g[(Subscript[h, k])]))g'[(Subscript[h, k])] == (1/2)(∂/(∂(Subscript[y, k])))[(∑_(k=1)^N)((((Subscript[y, k]) - (Subscript[t, k])))^2) ]g'[(Subscript[h, k])] == (1/2)(∂/(∂((Subscript[y, k])-(Subscript[t, k]))))[(∑_(k=1)^N)((((Subscript[y, k]) - (Subscript[t, k])))^2) ]((∂((Subscript[y, k])-(Subscript[t, k])))/(∂(Subscript[y, k])))* g'[(Subscript[h, k])] == ((Subscript[y, k])-(Subscript[t, k])) * g'[(Subscript[h, k])]

根据梯度下降算法，我们可以计算输出层第三层的权重调整

(Subscript[ω, ξk]) -> (Subscript[ω, ξk]) - η((∂E)/(∂(Subscript[ω, ξk]))) == (Subscript[ω, ξk]) - η((∂E)/(∂(Subscript[h, k])))((∂(Subscript[h, k]))/(∂(Subscript[ω, ξk]))) == (Subscript[ω, ξk]) - η(Subscript[δ, 0])[k](Subscript[α, ξ])

现在来看下隐藏层的输入 (Subscript[h, k]^hidden) 以及隐藏层的输出(Subscript[h, k]^(output))的关系

(Subscript[h, k]^output) == (∑_(j=0)^M) (Subscript[ω, jk])g[(Subscript[h, j]^hidden)]
(Subscript[h, k]^output) ==  (∑_(j=0)^M)(Subscript[ω, jk])(Subscript[α, j])
(Subscript[α, j]) == g[(Subscript[h, j]^hidden)]

隐藏层的权重调整

(Subscript[δ, h])[ξ] == (∑_(k=1)^N) ((∂E)/(∂(Subscript[h, k]^output)))((∂(Subscript[h, k]^output))/(∂(Subscript[h, ξ]^hidden))) == (∑_(k=1)^N) (Subscript[δ, 0])[k] * ((∂(Subscript[h, k]^output))/(∂(Subscript[h, ξ]^hidden)))
((∂(Subscript[h, k]^output))/(∂(Subscript[h, ξ]^hidden))) == ((∂(∑_(j=0)^M) (Subscript[ω, jk])g[(Subscript[h, j]^hidden)])/(∂(Subscript[h, ξ]^hidden)))  ==  ((∂ (Subscript[ω, ξk])g[(Subscript[h, ξ]^hidden)])/(∂(Subscript[h, ξ]^hidden))) == (Subscript[ω, ξk])g'[ (Subscript[h, ξ]^hidden)]

假设限定函数是 Sigmoid 函数

g[h_] = (1/(1 + Exp[-βh]))

g'[h] == ((\[DifferentialD]g)/(\[DifferentialD]h)) == ((\[DifferentialD]g)/(\[DifferentialD](βh)))((\[DifferentialD](βh))/(\[DifferentialD]h)) == β((E^(-βh))/(((1+(E^(-βh))))^2)) == βg[h](1-g[h])

(Subscript[δ, h])[ξ] == (∑_(k=1)^N) (Subscript[δ, 0])[k](Subscript[ω, ξk])g'[ (Subscript[h, ξ]^hidden)] == (Subscript[βα, ξ])(1-(Subscript[α, ξ]))(∑_(k=1)^N) (Subscript[δ, 0])[k](Subscript[ω, ξk])

((∂E)/(∂(Subscript[μ, τξ]))) == ((∂E)/(∂(Subscript[h, ξ]^hidden)))((∂(Subscript[h, ξ]^hidden))/(∂(Subscript[μ, τξ]))) == ((∂E)/(∂(Subscript[h, ξ]^hidden))) * (Subscript[x, τ]) == ((∑_(k=1)^N) ((∂E)/(∂(Subscript[h, k]^output)))((∂(Subscript[h, k]^output))/(∂(Subscript[h, ξ]^hidden))) )* (Subscript[x, τ]) == (Subscript[δ, h])[ξ] * (Subscript[x, τ])
((∂(Subscript[h, ξ]^hidden))/(∂(Subscript[μ, τξ])))==((∂(∑_(i=0)^M)(Subscript[μ, iξ])(Subscript[x, i]))/(∂(Subscript[μ, τξ])))== ((∂(Subscript[μ, τj])(Subscript[x, τ]))/(∂(Subscript[μ, τξ]))) == (Subscript[x, τ])

((∂E)/(∂(Subscript[μ, τξ]))) == (Subscript[δ, h])[ξ] * (Subscript[x, τ]) == (Subscript[βα, ξ])(1-(Subscript[α, ξ]))((∑_(k=1)^N) (Subscript[δ, 0])[k](Subscript[ω, ξk])) * (Subscript[x, τ]) 
(Subscript[δ, 0])[k] == ((Subscript[y, k])-(Subscript[t, k])) * g'[(Subscript[h, k])] == ((Subscript[y, k])-(Subscript[t, k])) * βg[(Subscript[h, k])]*(1-g[(Subscript[h, k])])== ((Subscript[y, k])-(Subscript[t, k])) * (Subscript[βy, k])*(1-(Subscript[y, k]))

((∂E)/(∂(Subscript[μ, τξ]))) == (Subscript[βα, ξ])(1-(Subscript[α, ξ])) * ((∑_(k=1)^N) ((Subscript[y, k])-(Subscript[t, k]))(Subscript[βy, k])(1-(Subscript[y, k]))*(Subscript[ω, ξk])) (Subscript[x, τ])

由此我们可以得到神经网络的反向传播时对 (Subscript[μ, τξ]) 权重的调整(Subscript[α, ξ])为隐藏层的输出即输出层的输入，(Subscript[x, τ])为输入层即第一层

(Subscript[μ, τξ]) -> (Subscript[μ, τξ]) - η((∂E)/(∂(Subscript[μ, τξ]))) == (Subscript[μ, τξ]) - η((Subscript[βα, ξ])(1-(Subscript[α, ξ]))((∑_(k=1)^N) ((Subscript[y, k])-(Subscript[t, k]))(Subscript[βy, k])(1-(Subscript[y, k]))(Subscript[ω, ξk])) (Subscript[x, τ]))

假设中间又多了一个隐藏层，我们同样可以采用链式求导法则，第一层到第二层的权重为υ，第二层到第三层的权重为μ，第三层到输出层的权重为ω，b为第一层隐藏层的输出

((∂E)/(∂(Subscript[υ, τξ]))) == ((∂E)/(∂(Subscript[h, ξ]^hidden1)))((∂(Subscript[h, ξ]^hidden1))/(∂(Subscript[υ, τξ]))) == (∑_(k=1)^N)((∂E)/(∂(Subscript[h, k]^out)))(∑_(n=1)^M)((∂(Subscript[h, k]^out))/(∂(Subscript[h, n]^hidden2)))((∂(Subscript[h, n]^hidden2))/(∂(Subscript[h, ξ]^hidden1)))* (Subscript[x, τ]) ==(∑_(k=1)^N) ((Subscript[y, k])-(Subscript[t, k])) * g'[(Subscript[h, k])](∑_(n=1)^M)((∂(Subscript[h, k]^out))/(∂(Subscript[h, n]^hidden2)))((∂(Subscript[h, n]^hidden2))/(∂(Subscript[h, ξ]^hidden1)))* (Subscript[x, τ])

(∑_(n=1)^M)((∂(Subscript[h, k]^out))/(∂(Subscript[h, n]^hidden2)))((∂(Subscript[h, n]^hidden2))/(∂(Subscript[h, ξ]^hidden1))) ==(∑_(n=1)^M) (Subscript[ω, nk])g'[ (Subscript[h, n]^hidden2)](Subscript[μ, ξn])g'[ (Subscript[h, ξ]^hidden1)]
g'[ (Subscript[h, n]^hidden2)] == βg[(Subscript[h, n]^hidden2)](1-g[(Subscript[h, n]^hidden2)]) == (Subscript[βα, n])(1-(Subscript[α, n]))
g'[ (Subscript[h, ξ]^hidden1)] == βg[(Subscript[h, ξ]^hidden1)](1-g[(Subscript[h, ξ]^hidden1)]) == (Subscript[βb, ξ])(1-(Subscript[b, ξ]))
 g'[(Subscript[h, k])] == βg[(Subscript[h, k]^output)](1-g[(Subscript[h, k]^output)]) == (Subscript[βy, k])(1-(Subscript[y, k]))
(∑_(n=1)^M)((∂(Subscript[h, k]^out))/(∂(Subscript[h, n]^hidden2)))((∂(Subscript[h, n]^hidden2))/(∂(Subscript[h, ξ]^hidden1))) == (∑_(n=1)^M)(Subscript[ω, nk])(Subscript[μ, ξn]) (β^2)(Subscript[α, n])(Subscript[b, ξ])(1-(Subscript[α, n]))(1-(Subscript[b, ξ]))
((∂E)/(∂(Subscript[υ, τξ]))) == (∑_(k=1)^N) (∑_(n=1)^M)(Subscript[ω, nk])(Subscript[μ, ξn]) (Subscript[α, n])(Subscript[b, ξ])((Subscript[y, k])-(Subscript[t, k])) * (β^3)(Subscript[y, k])(1-(Subscript[y, k])) (1-(Subscript[α, n]))(1-(Subscript[b, ξ]))

(Subscript[υ, τξ]) -> (Subscript[υ, τξ]) - η((∂E)/(∂(Subscript[υ, τξ]))) == (Subscript[υ, τξ]) - η*(∑_(k=1)^N) (∑_(n=1)^M)(Subscript[ω, nk])(Subscript[μ, ξn]) (Subscript[α, n])(Subscript[b, ξ])((Subscript[y, k])-(Subscript[t, k])) * (β^3)(Subscript[y, k])(1-(Subscript[y, k])) (1-(Subscript[α, n]))(1-(Subscript[b, ξ])) * (Subscript[x, τ])