在上一章,講過bp神經網路雖然取得了很大的進步,但它本身存在著一些無法避免的問題,其中乙個比較困惑的應該是區域性最優解問題。
只接觸那些你已經喜歡的東西是有風險的,即你可能會捲入乙個以自我為中心的漩渦,從而對任何與你的標準存在細微差異的事情都視而不見,即使你原本會喜歡它。這種現象被稱為「過濾器泡沫」(filter bubble),技術術語是「過適」(overfitting)。 — 必然所謂的區域性最優解的問題就是:卡在乙個小高點的位置,而卻認為自己在最高點,導致訓練提前結束。
很多優化的演算法相繼提出,目前來說比較火熱的也許應該算是多種演算法的結合。在2015 「機器學習」年度回顧 中使用遺傳演算法進化的神經網路開發了能夠自己玩超級瑪麗的演算法。
9世紀中葉,達爾文創立了科學的生物進化學說,以自然選擇為核心的達爾文演化論,第一次對整個生物界的發生、發展,作出了唯物的、規律性的解釋,推翻了特創論等唯心主義形上學在生物學中的統治地位,使生物學發生了乙個革命變革。
達爾文在重要著作《物種起源》:他使用在2023年代環球科學考察中積累的資料,試圖證明物種演化是通過自然選擇和人工選擇實現的。
2023年,holland的學生j.d.bagley在博士**中首次提出「遺傳演算法(genetic algorithms)」一詞簡稱ga,他抓住了《物種起源》兩個重要的規則:交叉和變異。把這兩個過程用演算法的方式完美的演繹出。
2023年,kenneth o. stanley 在massachusetts institute of technology上發表了,《evolving neural networks through
augmenting topologies》(神經網路進化拓撲結構),簡稱neat。
簡單的來看,神經網路進化拓撲結構用的是遺傳演算法和神經網路的結合,能夠最大程度的克服神經網路陷入區域性最小值的問題。
2023年sethbling用他開發了一款能玩super mario world的人工智慧。並開源了自己的**,短短的一千多行的**,就能夠自己學習,並能夠通關超級瑪麗。
**使用lua寫成,一千多行的**,結構也非常的清晰。
**用神經網路演算法計算權值,用遺傳演算法(交叉和變異)優化權重。
神經網路的權值計算過程:
function evaluatenetwork(network, inputs)
table.insert(inputs, 1)
if #inputs ~= inputs then
console.writeline("incorrect number of neural network inputs.")
return {}
endfor i=1,inputs do
network.neurons[i].value = inputs[i]
endfor _,neuron in pairs(network.neurons) do
local sum = 0
for j = 1,#neuron.incoming do
local incoming = neuron.incoming[j]
local other = network.neurons[incoming.into]
sum = sum + incoming.weight * other.value
endif #neuron.incoming > 0 then
neuron.value = sigmoid(sum)
endend
local outputs = {}
for o=1,outputs do
local button = "p1 " .. buttonnames[o]
if network.neurons[maxnodes+o].value > 0 then
outputs[button] = true
else
outputs[button] = false
endend
return outputs
end
交叉:
function crossover(g1, g2)
-- make sure g1 is the higher fitness genome
if g2.fitness > g1.fitness then
tempg = g1
g1 = g2
g2 = tempg
endlocal child = newgenome()
local innovations2 = {}
for i=1,#g2.genes do
local gene = g2.genes[i]
innovations2[gene.innovation] = gene
endfor i=1,#g1.genes do
local gene1 = g1.genes[i]
local gene2 = innovations2[gene1.innovation]
if gene2 ~= nil and math.random(2) == 1 and gene2.enabled then
table.insert(child.genes, copygene(gene2))
else
table.insert(child.genes, copygene(gene1))
endend
child.maxneuron = math.max(g1.maxneuron,g2.maxneuron)
for mutation,rate in pairs(g1.mutationrates) do
child.mutationrates[mutation] = rate
endreturn child
end
super mario world訓練過程比較簡潔,訓練了一晚上以後,能夠順利的通過。再次用遊戲的方法,看到了神經網路的威力。通過神經網路訓練權值,並用遺傳演算法使自己最大限制的不掉進區域性最小值裡,可以訓練出很多優秀的專案。
但這種應用處於初期,目前的階段只能用於娛樂專案上,真正能夠實用性的東西,還需要很多的努力。
from:
從生物神經網路到人工神經網路
如今提及人工智慧,大家期待的一定是某種可以 學習 的方法,這種方法使用數學模型從資料中獲取模式的某種表示。在眾多 學習 方法中,獲得最多關注,承載最多期望的非 神經網路 莫屬。既然我們將這種數學方法稱作神經網路,那麼他必然和廣泛存在於生物體內的神經網路存在某種聯絡。讓我們考察乙個典型的神經連線。每個...
從MLP到神經網路
多層感知器 mlp 是一種非常簡單的神經網路,其實現起來也是非常容易滴。那我們就來看一看吧 首先,先看一下來自維基百科的介紹 多層感知器 multilayer perceptron,縮寫mlp 是一種前向結構的 人工神經網路 對映一組輸入向量到一組輸出向量。mlp可以被看作是乙個有向圖,由多個的節點...
從自聯想神經網路到深度神經網路
第六篇,簡要描述深度神經網路模型。自聯想神經網路是很古老的神經網路模型,簡單的說,它就是三層bp網路,只不過它的輸出等於輸入。很多時候我們並不要求輸出精確的等於輸入,而是允許一定的誤差存在。所以,我們說,輸出是對輸入的一種重構。其網路結構可以很簡單的表示如下 如果我們在上述網路中不使用sigmoid...