基于神经网络的机器深度学习

设想一个注塑生产情况,操作者开机时只需要打开按钮,不关心任何注塑设备的参数设置,设备在经过几次试生产后,设备自动收集生产数据,自动了解这台设备的运转属性,自动补偿、优化参数,然后开始生产,此过程不需要任何人工参与。这并不是白日梦,目前的技术神经网络计算技术就可以实现。

对于注塑行业,注塑质量的控制通常使用DOE分析的方法,这种方法通常通过计算机的辅助计算,然后人工对结果进行分析、优化出有限的最佳参数,然后人工对设备的工艺参数,如温度、压力和时间等进行设置,以达到控制质量的目的。

这种方式需要半人工的计算和判断,因此对于生产制造的部门来说有一定的推广的困难。而且DOE是否能够成功,还取决于人的经验,比如为一个工艺选择哪些参数为关键参数,这些参数需要在哪个水平上进行分析。

在DOE的参考资料中介绍都是通过头脑风暴来实现的,但是对于一个完全新的工艺,或是人的经验不足,DOE这种方法就没有效率。

实际上DOE的方法是万物皆有因果的角度去考虑的,以上注塑质量的评分是同A、B、C、D四个变量有关系的,这个关系可以通过这个公式表达:

Y:综合评分(如代表注塑质量)

wn:权重

Xn:变量

公式(1)

DOE目的是避免推演数学家才能解决的数学公式问题,这个技术通过有限的数据进行输出和输入的相关性分析问题。这种方法一是阉割更多可能的参数(通过经验),另外是分析只在一定范围有效。比如注塑机的控制,实际设备的参数要达到几十个,半导体行业甚至需要上百个工艺参数来进行控制。

新兴的神经网络计算技术借助工业电子化的基础,通过日常海量的数据分析,避免了复杂的数学原理学习,可以通过机器自动学习数据,给出算法公式。

上图是神经网络分析的简化图,X代表输入参数,比如注塑工艺的温度、压力、时间和速度。实际上,神经网络分析中,这些参数可以包含所有的机器的设置参数。对于计算完全不用担心,目前的计算机完全有这个计算能力。

w参数代表权重,这些权重相当于设备的未知属性,当然每台设备的属性不一,如热电偶的误差,电路的误差,设备的磨损等。w就是在神经网络中需要解决的未知量。就像是文章开始介绍那样,分析者不需要知道生产参数,这些参数初始值是随机的。

b是偏置,数学向相当于曲线的截距,大家把她当作常量补偿就可以。b也是初始随机值。

接下来,神经网络需要圆圈内的两步计算,先按照公式(1)进行求和,先后是非线性化,非线性化目前方法有sigmoid、RELU等,我们本篇采用sigmoid方法。

Y就是我们输出的值,通常Y可以是分类的,如图像识别区分是狗还是猫,也可以是回归值。关于输出的算法有很多,我们为了讨论神经网络的应用,我们做了简化,另外神经网络其实除了输入、输出层之外还有隐藏层,隐藏层对于计算结果的优化非常重要,我以后会在尺寸工程的分析中介绍。

神经网络计算虽然好,但需要编程工具如Python、C++等实现,目前在制造也难于推广的原因也就是编程的原因,编程对于专注于工艺和设计人员来说是个很大的障碍。

本文尝试克服编程的困扰,通过EXCEL这个普通的计算工具来实现分析。

以上是excel的参数设置,经过50000次迭代计算的参数输出。将综合评分设置为Y,ABCD代表四个注塑工艺参数,图中ABCD各有三个水平,0.01低水平,0.5中间水平,0.99高水平。使用0.01代表低水平的原因是为了数据正太化计算。

优化100次后的结果,目标线(实际测量值)是蓝色,这条线过于平坦,实际上数据通常需要log化等改造,橙色线为计算预测值。

优化1000次结果。

这是50000次参数拟合结果,如果计算达到10万次,拟合效果会更加好,另外Y的输入数据不太理想,也是照成不能完美收敛的一个原因。这个在实际生产数据下会改善。但不管怎样这些参数都达到理想的迭代优化趋势。

Cost迭代1000次的数据曲线,达到预期的优化,但是在100次后优化速度下降,主要是目标值过于平坦的原因。

Cost优化50000次的数据趋势。

权重w1的1000次和50000次的对比,注意拐点发生的位置,和优化速度的变化。

偏置b的1000次和50000次的对比,注意拐点发生的位置,和优化速度的变化。

此EXCEL的神经网络计算虽然引用了VBA的编程,但是大多数都是通过宏录制完成的编程,稍微人工修改。并且大部分修改通过Github的代码借鉴完成,不需要太多的编程知识。这个源代码开放给大家尝试。我在后续会介绍神经网络在尺寸工程上的应用,会使用更加深入的隐藏层来进行分析,并且坚持为制造行业的应用考虑使用EXCEL来实现。

Function sigmoid(z) As Double

sigmoid = 1 / (1 + Exp(-z))

End Function

Function sigmoid_p(z) As Double

sigmoid_p = sigmoid(z) * (1 - sigmoid(z))

End Function

Sub clear()

ActiveWorkbook.Sheets(2).Select

Range("A2").Select

Range(Selection, Selection.End(xlToRight)).Select

Range(Selection, Selection.End(xlDown)).Select

Selection.Delete

ActiveWorkbook.Sheets(1).Select

Range("C3:F4").Select

Selection.ClearContents

Range("A1").Select

End Sub

Sub main()

Dim data As Range

Dim point As Variant

Dim w1, w2, w3, w4, b, z As Double

Dim i, ri As Integer

Dim Pred, Target, cost As Double

Dim dcost_pred, dpred_dz, dcost_dz As Double

Dim dz_dw1, dz_dw2, dz_dw3, dz_dw4, dz_db As Double

Dim dcost_dw1, dcost_dw2, dcost_dw3, dcost_dw4, dcost_b As Double

If ActiveWorkbook.Sheets(2).Range("A2").Value <> Empty Then

clear

End If

Set data = Range("K3:O11")

w1 = Rnd()

w2 = Rnd()

w3 = Rnd()

w4 = Rnd()

b = Rnd()

Range("C3").Value = w1

Range("D3").Value = w2

Range("E3").Value = w3

Range("F3").Value = w4

Range("G3").Value = b

For i = 1 To Range("D8").Value

ri = Int((data.Rows.Count - 1 + 1) * Rnd + 1)

point = Array(data(ri, 1).Value, data(ri, 2).Value, data(ri, 3).Value, data(ri, 4).Value, data(ri, 5).Value)

z = point(0) * w1 + point(1) * w2 + point(2) * w3 + point(3) * w4 + b

Pred = sigmoid(z)

Target = point(4)

cost = Exp(Pred - Target)

dcost_pred = 2 * (Pred - Target)

dpred_dz = sigmoid_p(z)

dz_dw1 = point(0)

dz_dw2 = point(1)

dz_dw3 = point(2)

dz_dw4 = point(3)

dz_db = 1

dcost_dz = dcost_pred * dpred_dz

dcost_dw1 = dcost_dz * dz_dw1

dcost_dw2 = dcost_dz * dz_dw2

dcost_dw3 = dcost_dz * dz_dw3

dcost_dw4 = dcost_dz * dz_dw4

dcost_db = dcost_dz * dz_db

w1 = w1 - Range("D7").Value * dcost_dw1

w2 = w2 - Range("D7").Value * dcost_dw2

w3 = w3 - Range("D7").Value * dcost_dw3

w4 = w4 - Range("D7").Value * dcost_dw4

b = b - Range("D7").Value * dcost_db

Range("C4").Value = w1

Range("D4").Value = w2

Range("E4").Value = w3

Range("F4").Value = w4

Range("G4").Value = b

ActiveWorkbook.Sheets(2).Range("A" & i + 1).Value = cost

ActiveWorkbook.Sheets(2).Range("B" & i + 1).Value = w1

ActiveWorkbook.Sheets(2).Range("C" & i + 1).Value = w2

ActiveWorkbook.Sheets(2).Range("D" & i + 1).Value = w3

ActiveWorkbook.Sheets(2).Range("E" & i + 1).Value = w4

ActiveWorkbook.Sheets(2).Range("F" & i + 1).Value = b

Range("D9").Value = i

'Application.Wait (Now + TimeValue("0:00:05"))

'Dim myChart As ChartObject

'For Each myChart In ActiveSheet.ChartObjects

'    myChart.Chart.Refresh

'    ActiveSheet.Calculate

'Next myChart

Next i

End Sub

(0)

相关推荐