神经网络从被人忽悠到忽悠人(三)

引子

在上一章,讲过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 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
    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 child
end

看不见的努力和优化

Super Mario World训练过程比较简洁,训练了一晚上以后,能够顺利的通过。再次用游戏的方法,看到了神经网络的威力。通过神经网络训练权值,并用遗传算法使自己最大限制的不掉进局部最小值里,可以训练出很多优秀的项目。

但这种应用处于初期,目前的阶段只能用于娱乐项目上,真正能够实用性的东西,还需要很多的努力。

from: http://datartisan.com/article/detail/117.html

时间: 2024-10-19 14:53:08

神经网络从被人忽悠到忽悠人(三)的相关文章

人的烦恼来自人的欲望,人的欲望来自人的能力

人的烦恼来自人的欲望,人的欲望来自人的能力. 能力越强,欲望越大,欲望越大,则烦恼越多. 所以,欲望少一分,则烦恼少一分,快乐便多一分. 也许正如<庄子·列御寇>中所说,“巧者劳而知者忧,无能者无所求.饱食而遨游,泛若不系之舟,虚而遨游者也”. 还有一首诗: 铁甲将军夜渡关, 朝臣待漏五更寒. 山寺日高僧未起, 算来名利不如闲. 表达的大概也是这个意思吧.

多少人没熬过那三厘米!

竹子用了4年的时间,仅仅长了3cm,在第五年开始,以每天30cm的速度疯狂的生长,仅仅用了六周的时间就长到了15米.其实,在前面的四年,竹子将根在土壤里延伸了数百平米,做人做事亦是如此,不要担心你此时此刻的付出得不到回报,因为这些付出都是为了扎根,等到时机成熟,你会登上别人遥不可及的巅峰!人生需要储备!多少人没熬过那三厘米! 多少人没熬过那三厘米!

神经网络从被人忽悠到忽悠人(五)

前面一节讲过,Vladimir Vapnik的出现,在神经网络的发展过程中起到了很关键的作用,而这种所谓的作用就是挑战.Vladimir Vapnik到底提出了什么理论能有这么大的影响呢?大家都非常熟悉的分类方法:支持向量机(SVM)Vladimir Vapnik 支持向量机(SVM) Vapnik等人在多年研究统计学习理论基础上对线性分类器提出了另一种设计最佳准则.其原理也从线性可分说起,然后扩展到线性不可分的情况.甚至扩展到使用非线性函数中去,这种分类器被称为支持向量机(Support Ve

神经网络从被人忽悠到忽悠人(一)

为何取这标题呢,只是觉得目前人工智能只用于娱乐而已. 很早的时候就想写几篇关于人工智能的东西,把人工智能的东西写的通俗易懂点,但是毕竟人工智能的东西涉及的领域太广了,特别是对数学和概率有比较深的理解,如果只是想简单的了解,可以跳过文章的公式. 很难想象有什么事物会像廉价.强大.无处不在的人工智能那样拥有“改变一切”的力量.<必然> 前段时间的AlphaGo再次的把人工智能炒的火热,关于人工智能的讨论又再次进入讨论的风口浪尖上.各个方面对AlphaGo技术的猜测,神经网络也再次成为了技术的焦点.

神经网络从被人忽悠到忽悠人(二)

引子 Minsky说过神经网络无法解决异或问题.60年代关于神经网络的研究还取得了一定的进展,但是都没有取得重大的突破.70年代,神经网络的研究进入了萧条期,人工智能里产生了许多不同的方向,神经网络,好像被人们所忘记. 直到1986年,David Rumelhar和Geoffery Hinton等人提出了反向传播(Backpropagation,BP)算法,解决了两层神经网络所需要的复杂计算量问题,克服了Minsky说过神经网络无法解决异或问题,该算法是对神经网络受到批判的一个有力的回答. 其中

除皮卡丘让人疯狂、让人晕外,任天堂还干过的晕眩囧事

如果有一款超有趣的游戏机,但只能玩15分钟,你会喜欢吗? 文/张书乐 原载于<人民邮电报>2016年8月12日<乐游记>专栏114期 在手机游戏<口袋妖怪Go>大获成功的一片赞美声中,人们似乎看到了AR和VR未来在娱乐和商业领域无可限量的前景.但事物总具有两面性,接下来,我们真的要"黑"一下奇迹创造者任天堂. 比其他游戏巨头更具有创新"基因"的任天堂,总是在"黑科技"的九死一生中跌宕起伏.先谈一件往事,依然和口

同步函数 生产者和消费者模式 加强版(多人生产和多人消费)

曾经搞了半天, 生产者和消费者模式  加强版(多人生产 多人消费 ).. 以前的代码格式就不再吐槽了(以后努力改进) //输出结果是一个无限循环 import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 多个生产者&多个消费者模式 * 多个生产者不断生产,多个消费者不停的消费

人件札记:人血馒头

前言:相信鲁迅先生的<人血馒头>无人不知,血馒头可以拯救一个要死的命.大家都知道,这是个骗局. 来一个好的架构师,然后项目谁走谁留都无所谓 这是今天上级给我的建议,说他的朋友给他提过这样的想法:让一个牛逼的架构师架构好项目,然后找一些大学生填填代码,项目就完成了,谁走了,下一个谁就可以立马上任,这样就OK了. 这又是一个神话,很多有"理想"的人都喜欢编织这样的"巴比伦",简直在他们看来,这就是个解决问题的完美解决方案. 我不知道提出这样观点的人,是否真正

人月神话读后感(三)

作为软件工程的经典著作,<人月神话>的主要贡献是对软件开发过程的几个重要关键点,提出了独到的见解. 其中内容就是: (1)提倡外科手术式的团队组织: 在软件开发组织上的过份民主,往往带来的是没有效率和责任,参与其中的人想法太多,层面参差不齐.所以,软件开发的组织,应该借鉴外科手术式的团队方式,有一个主要的负责人,其他人都是分工协作的副手,这样效率最好,结果最好.(2)软件项目的核心概念要由很少的人来完成,以保证 概念的完整性: 少就是多,项目的定位需要和功能多少的权衡.太多的想法,使项目没有焦