神經網路從被人忽悠到忽悠人(三)

引子

在上一章,講過bp神經網路雖然取得了很大的進步,但它本身存在著一些無法避免的問題,其中一個比較困惑的應該是局部最優解問題。

只接觸那些你已經喜歡的東西是有風險的,即你可能會捲入一個以自我為中心的漩渦,從而對任何與你的標準存在細微差異的事情都視而不見,即使你原本會喜歡它。這種現象被稱為「過濾器泡沫」(filter bubble),技術術語是「過適」(overfitting)。 — 必然

所謂的局部最優解的問題就是:卡在一個小高點的位置,而卻認為自己在最高點,導致訓練提前結束。

很多優化的演算法相繼提出,目前來說比較火熱的也許應該算是多種演算法的結合。在2015 「機器學習」年度回顧 中使用遺傳演算法進化的神經網路開發了能夠自己玩超級瑪麗的演算法。

遺傳演算法

9世紀中葉,達爾文創立了科學的生物進化學說,以自然選擇為核心的達爾文進化論,第一次對整個生物界的發生、發展,作出了唯物的、規律性的解釋,推翻了特創論等唯心主義形而上學在生物學中的統治地位,使生物學發生了一個革命變革。

達爾文

在重要著作《物種起源》:他使用在1830年代環球科學考察中積累的資料,試圖證明物種演化是通過自然選擇和人工選擇實現的。

1967年,Holland的學生J.D.Bagley在博士論文中首次提出「遺傳演算法(Genetic Algorithms)」一詞簡稱GA,他抓住了《物種起源》兩個重要的規則:交叉和變異。把這兩個過程用演算法的方式完美的演繹出。

Super Mario World的人工智慧

2002年,Kenneth O. Stanley 在Massachusetts Institute of Technology上發表了,《Evolving Neural Networks through

Augmenting Topologies》(神經網路進化拓撲結構),簡稱NEAT。

簡單的來看,神經網路進化拓撲結構用的是遺傳演算法和神經網路的結合,能夠最大程度的克服神經網路陷入局部最小值的問題。

2015年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 {} end for i=1,Inputs do network.neurons[i].value = inputs[i] end for _,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 end if #neuron.incoming > 0 then neuron.value = sigmoid(sum) end end 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 end end return outputsend

交叉:

function crossover(g1, g2) -- Make sure g1 is the higher fitness genome if g2.fitness > g1.fitness then tempg = g1 g1 = g2 g2 = tempg end local child = newGenome() local innovations2 = {} for i=1,#g2.genes do local gene = g2.genes[i] innovations2[gene.innovation] = gene end for 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)) end end child.maxneuron = math.max(g1.maxneuron,g2.maxneuron) for mutation,rate in pairs(g1.mutationRates) do child.mutationRates[mutation] = rate end return childend

看不見的努力和優化

Super Mario World訓練過程比較簡潔,訓練了一晚上以後,能夠順利的通過。再次用遊戲的方法,看到了神經網路的威力。通過神經網路訓練權值,並用遺傳演算法使自己最大限制的不掉進局部最小值里,可以訓練出很多優秀的項目。

但這種應用處於初期,目前的階段只能用於娛樂項目上,真正能夠實用性的東西,還需要很多的努力。


推薦閱讀:

你好,若琪!你讓我們看到了家庭人工智慧,不僅僅是一個外表溫潤的機器人
度秘想要悄悄進入客廳,而且上來就把目標設在了5000萬
教你搭建你自己的「深度學習」機器
首款人工智慧鑒包神器,從此不怕買到假包包了!
《銀翼殺手 2049》的複製人與《西部世界》的 host 對比,誰會更勝一籌?

TAG:神经网络 | 人工智能 |