2019-03-27 21:37:57 azeyeazeye 阅读数 699
  • Fast.ai 深度学习实战课程「中文字幕」

    本课程由 Jeremy Howard 教授开设,共8节。目的是让大家在不需要深入研究高水平数学问题的情况下,学习如何建立先进的深度学习模型。 Jeremy Howard 教授结合自己参加 Kaggle 大赛并夺魁的经验认为,传统学院派的教学方式对于大多数学习者来说已经不适用,应该以问题为引导,以实践为驱动,尽快切入到核心理论和核心工具的使用上,掌握深度学习优模型的构建方法。

    16210 人正在学习 去看看 AI100讲师
2019-11-10 11:44:56 public669 阅读数 89
  • Fast.ai 深度学习实战课程「中文字幕」

    本课程由 Jeremy Howard 教授开设,共8节。目的是让大家在不需要深入研究高水平数学问题的情况下,学习如何建立先进的深度学习模型。 Jeremy Howard 教授结合自己参加 Kaggle 大赛并夺魁的经验认为,传统学院派的教学方式对于大多数学习者来说已经不适用,应该以问题为引导,以实践为驱动,尽快切入到核心理论和核心工具的使用上,掌握深度学习优模型的构建方法。

    16210 人正在学习 去看看 AI100讲师

今天分享一个基于深度学习而开发的AI小游戏

简单介绍

这一款基于深度学习的五子棋小游戏的界面是使用Unity开发的,而网络结构是使用keras搭建的。

环境

笔者的环境如下

操作系统 windows 10
使用框架是keras

初始化界面

在这里插入图片描述

游戏界面

在这里插入图片描述

棋谱部分代码

using System;
using System.Collections;
using System.Collections.Generic;
using Wineforever;
using System.Linq;
using System.IO;
using UnityEngine;
using System.Diagnostics;
using System.Text;

public static class ai{
    public struct Point
    {
        public int X;
        public int Y;
    }
    public static Point move()
    {
        var root = System.IO.Directory.GetCurrentDirectory();
        //调用预测脚本
        System.Console.InputEncoding = System.Text.Encoding.UTF8;
        System.Diagnostics.Process exep = new System.Diagnostics.Process();
        exep.StartInfo.UseShellExecute = false;
        exep.StartInfo.FileName = "cmd.exe";
        exep.StartInfo.RedirectStandardInput = true;
        exep.Start();
        exep.StandardInput.WriteLine("cd /d "+ root);
        exep.StandardInput.WriteLine("python predict.py");
        exep.StandardInput.WriteLine("exit()");
        exep.WaitForExit();
        //分析输出信息
        var policy_dic = Wineforever.String.client.LoadFromSheet(root + "\\policy.wf")["Policy"];//预测落子
        //var eva = double.Parse(Wineforever.String.client.LoadFromSheet(System.AppDomain.CurrentDomain.BaseDirectory + "Assets\\eva.wf")["Evaluation"][0]);//胜率指数
        var policy_list = policy_dic.Select((i => double.Parse(i))).ToList();
        var sorted = policy_list.Select((x, i) => new KeyValuePair<double, int>(x, i)).OrderByDescending(x => x.Key).ToList();
        //var policy_sorted = sorted.Select(i => i.Key).ToList();
        var policy_index = sorted.Select(i => i.Value).ToList();
        //转换成落子坐标
        var Move = new Point();
        for (int i = 0; i < 361; i++)
        {
            int index = policy_index[i];
            int Y = index % 19, X = index / 19;
            if (GameObject.Find("board").GetComponent<logic>().Board_State[X,Y] == -1)
            {
                Move.X = X;
                Move.Y = Y;
                break;
            }
        }
        return Move;
    }
}

网络结构

网络结构就很简单了,使用keras搭建四层卷积层,输入的尺寸是4x19x19

ef create_model():
    lr = 1e-4
    policy_net = Sequential()
    policy_net.add(Convolution2D(filters=32,kernel_size=(5,5),padding='same', data_format="channels_first", activation="relu",kernel_regularizer=l2(lr),input_shape=(4,19,19)))
    policy_net.add(Convolution2D(filters=64,kernel_size=(3,3),padding='same', data_format="channels_first", activation="relu",kernel_regularizer=l2(lr)))
    policy_net.add(Convolution2D(filters=128,kernel_size=(3,3),padding='same', data_format="channels_first", activation="relu",kernel_regularizer=l2(lr)))
    policy_net.add(Convolution2D(filters=4,kernel_size=(1,1),padding='same', data_format="channels_first", activation="relu",kernel_regularizer=l2(lr)))
    policy_net.add(Flatten())
    policy_net.add(Dense(361,activation="softmax",kernel_regularizer=l2(lr)))
    adam = Adam(lr=2e-4)
    policy_net.compile(optimizer=adam,loss='categorical_crossentropy')
    policy_net.save('policy_model.h5')

训练

使用命令:

python train.py

测试

在文件夹下点击gobang.exe即可

说明

项目中我已经将tarin的一部分数据放在Assets下的train中了,数据的数量比较的少,大概只用三四百个数据的样子,这里呢,当你完整和AI玩一盘游戏后所产生的对战数据也会被保存在train的目录下,这样即可为后面的训练提供数据的基础。训练时,它的loss下降的是很漫长的,这里提供的模型,是经过使用了30000条数据经过大概三天的时间训练而来的。大家在这个模型的基础上继续训练,会有一个相对好的结果。但是呢,这个AI现在的棋力还是很弱的,暂时性的只是学会了如何下棋,想要达到打败普通人还是很难的。想要达到一个很好的效果,还是需要花费大量的时间和资源进行训练。

总结

由于笔者的水平有限,在表述上有不准确的地方,还请谅解。。。
源码地址:https://github.com/huzixuan1/AI_Gomoku
有问题欢迎添加1017190168讨论交流

2017-12-05 14:26:30 kwame211 阅读数 384
  • Fast.ai 深度学习实战课程「中文字幕」

    本课程由 Jeremy Howard 教授开设,共8节。目的是让大家在不需要深入研究高水平数学问题的情况下,学习如何建立先进的深度学习模型。 Jeremy Howard 教授结合自己参加 Kaggle 大赛并夺魁的经验认为,传统学院派的教学方式对于大多数学习者来说已经不适用,应该以问题为引导,以实践为驱动,尽快切入到核心理论和核心工具的使用上,掌握深度学习优模型的构建方法。

    16210 人正在学习 去看看 AI100讲师

深度学习与强化学习

随着 DeepMind 公司的崛起,深度学习和强化学习已经成为了人工智能领域的热门研究方向。除了众所周知的 AlphaGo 之外,DeepMind 之前已经使用深度学习与强化学习的算法构造了能够自动玩 Atari 游戏的 AI,并且在即时战略游戏 StarCraft II 的游戏 AI 构建上做出了自己的贡献。虽然目前还没有成功地使用 AI 来战胜 StarCraft II 的顶尖职业玩家,但是 AI 却能够带给大家无穷的想象力和期待。

本篇 PPT 将会从强化学习的一些简单概念开始,逐步介绍值函数与动作值函数,以及 Q-Learning 算法。然后介绍深度学习中卷积神经网络的大致结构框架。最后将会介绍卷积神经网络是如何和强化学习有效地结合在一起,来实现一些简单的游戏 AI。

之前也写过一份PPT《当强化学习遇见泛函分析》,两份 PPT 有一些重复的地方,读者选择一些看即可。之前文章从强化学习的定义出发,一步一步地给读者介绍强化学习的简单概念和基本性质,并且会介绍经典的 Q-Learning 算法。文章的最后一节会介绍泛函分析的一些基本概念,并且使用泛函分析的经典定理 Banach Fixed Point Theorem 来证明强化学习中 Value Iteration 等算法的收敛性。

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

2019-09-02 11:22:23 wangwei19871103 阅读数 100
  • Fast.ai 深度学习实战课程「中文字幕」

    本课程由 Jeremy Howard 教授开设,共8节。目的是让大家在不需要深入研究高水平数学问题的情况下,学习如何建立先进的深度学习模型。 Jeremy Howard 教授结合自己参加 Kaggle 大赛并夺魁的经验认为,传统学院派的教学方式对于大多数学习者来说已经不适用,应该以问题为引导,以实践为驱动,尽快切入到核心理论和核心工具的使用上,掌握深度学习优模型的构建方法。

    16210 人正在学习 去看看 AI100讲师

深度强化学习

深度强化学习可以理解为深度学习和强化学习的结合体,有个大神说AI=RL+DL,就是这个意思,Deep Mind用这个技术玩游戏,下围棋,一时间引领了AI的潮流。
在这里插入图片描述

强化学习

先说说强化学习,简单来说就是你有一个智能体,他会观察环境,然后做出相应的行为,然后环境反馈给他一个奖励,环境随之也会发生变化,然后智能体继续观察环境做出行为,继续这个循环,如果环境反馈的奖励是好的,那智能体就知道刚才的行为是对的,以后要多这样做,如果反馈的奖励是不好的,那就说明刚才的行为不好,以后要少做,举个例子,如果机器看到桌子上有水杯,然后采取了打翻水杯的行为,然后地球爷爷说你这样做不好,浪费水源,于是机器就知道了,刚才的行为是不好的,以后不能做了,于是他下次看到水杯就不会这样了。:
在这里插入图片描述
如果他发现地上有水,他采取了拖地的动作,把水拖干净了,然后地球爷爷说他真好,谢谢,于是下次他再看到地上有水,就会去拖地,因此他可能就学会看到地上有水就去拖地了。总结来说就是我们的智能体会希望去得到最大的奖励:
在这里插入图片描述
再举个下围棋的例子,机器看到的是棋谱,然后做出下一步棋:
在这里插入图片描述
然后人类选手继续走:
在这里插入图片描述
大多数情况下其实没有奖励,落子下去什么都没发生,只有当棋下完了,赢或者输才有奖励,这个奖励是很稀疏的,那到底每一步要怎么下棋才算好呢,是个值得讨论的问题,或许我们应该把一局当整体来看:
在这里插入图片描述

与监督学习的区别

监督学习来下围棋就是你看到什么情况,下什么棋,但是情况太多了,我们并不能知道所有情况该怎么下棋比较好,这样的下棋就好像有个老师在教你一样,看到什么做什么。

强化学习就不一样了,他下围棋只看整一局最后是输了还是赢了,来决定遇到什么样的情况应该做什么,是自己根据经验来学习的,当然在训练的时候不可能人去陪着下,会训练两个智能体相互下棋。AlphaGo其实是监督学习和强化学习的结合体:
在这里插入图片描述

训练语音对话机器人

举一个语音对话的机器人的例子,如果我们用监督学习,那就是让机器看到什么,就说什么,都是有标准答案的。如果是强化学习的话就是跟机器对话,然后根据机器的回答,来告诉他这个回答好不好,好的话就给他正奖励,不好的就负奖励,他为了让奖励越大,会学着用好的回答来进行对话:
在这里插入图片描述
当然用人工的方法去跟机器对话来训练他是不太现实的,那得训练多久啊,所以一般都是训练两个代理,让他们相互对话,但是这样可能会出现最后两个人就一直说同一句话的情况,因为双方给相互的奖励都比较大,所以就这么无限循环了:
在这里插入图片描述
所以传统的做法就是预先定义一些规则,什么样的是好的,什么样的是不好的对话:
在这里插入图片描述

更多的应用

比如交互式搜索的例子,可以用强化学习来训练,比如人说一个词让机器来搜索,如果机器不确定是什么,就会反问人,这样就可以给他低分,如果机器直接把结果给他,他觉得这个结果又多好,就给多高的分:
在这里插入图片描述
当然还有其他的应用,比如开直升机,自动驾驶,给谷歌机房节电,文子生成等等:
在这里插入图片描述

玩游戏的例子

强化学习最多的应用是在让机器玩游戏,我们知道现在围棋,星际,dota,德扑都已经被机器给玩爆了,我们来看看一般的强化学习是怎么做的,其实OpenAI已经开源了很多强化学习玩游戏的环境和框架,可以用来学习。其实机器玩游戏跟人是一样的,他也是看画面,也就是一堆像素点,然后来学习要用什么动作来获得最高分数:
在这里插入图片描述
我们来看这个太空入侵的例子,这个游戏技术的条件就是所有外星人被消灭,或者自己的飞船被外星人消灭,机器看到的跟我们看到的一样,都是这么一副图,左上角的是分数,中间的是外心人,下面的是掩体和自己的飞船:
在这里插入图片描述
强化学习的过程应该是这样的,首先机器看到s1s_1这个状态,然后他采取动作a1a_1右移,得到的奖励r1r_1是0,状态变为了s2s_2,然后他采取动作a2a_2射击,得到的奖励r2r_2是5,状态变为了s3s_3,通常游戏也包含很多随机元素,或许你消灭一个外星人得到的分数可能是4,也可能是3:
在这里插入图片描述如此反复下去直到最后一次采取aTa_T,获得的奖励是rTr_T,游戏结束,这个整个过程我们叫做一个episode,也就是一个开始到结束的一个过程。我们希望最大化机器每次游戏的过程的累计奖励:
在这里插入图片描述

强化学习的难点:

第一,可能有奖励的延迟,因为我们每次只是射击之后才能会获得奖励,然后会认为射击这个动作是好的,然后可能一直采取射击了,但是其实射击之前的一系列移动对射击是有帮助的。我们希望机器能有一点未来的眼光,有些动作或许现在没奖励,但是对未来的奖励有所帮助。同样在下围棋也是一样,短期的牺牲可能会换来更多长期的奖励。

第二,如果没有进行射击动作而得到奖励,机器可能只会左右移动了,永远都不会去射击,这个就是个问题,我们希望机器能够去探索未知的世界,希望他有有好奇心,那样才可以学到更多的东西。
在这里插入图片描述

强化学习比较新的方法

强化学习一般分为基于策略的和基于价值的,具体本篇先介绍下基于策略的,当时比较好的方法是A3C,就是一个分布式结合策略和价值的改进版,听说很厉害:
在这里插入图片描述
一些相关文章:
在这里插入图片描述

强化学习基于策略的方法

我们说机器学习其实就是在找一个方法,有个输入,有个输出,强化学习也一样,我们要找到一个方法π\pi,你把环境当做输入,然后行动当做输出,至于要怎么样的输出才是好的,就看环境给予你的奖励:
在这里插入图片描述
我们知道深度学习的基本步骤,我们可以把要找的方法用神经网络来学出来,我们可以记这个方法叫Actor,暂时叫演员吧:
在这里插入图片描述
我们可以把所观察的到环境用向量表示,然后输入到一个神经网络,输出希望就是不同动作的概率,然后我们选择概率最大的那个来行动,比如太空入侵的例子,我们可以把看到的像素画面当做一个向量或者矩阵作为输入,经过神经网络训练后输出应该采取的行为的分布,选择可能性最大的那个,我们之用神经网络来训练出这个Actor也是因为神经网络的泛化能力强:
在这里插入图片描述
然后我们进行第二步,找出最好的那个方法:
在这里插入图片描述
那怎么来衡量一个Actor的好坏呢,我们用目标函数,就像我们在监督学习的时候一样,我们希望输出的分布和真实的分布越接近越好,希望损失越小越好:
在这里插入图片描述
我们先用参数θ\theta初始化这个神经网络actor,然后用这个actor去玩游戏,在s1s_1的时候采取了a1a_1获得的奖励reward是r1r_1,环境变成了s2s_2,然后采取a2a_2获得的奖励reward是r2r_2,环境变成了s3s_3,以此类推,直到游戏结束,我们把功总得奖励记作RθR_\theta。因为游戏具有随机性,这个是设计游戏的时候做的,所以或许同样的actor也会得到不同的RθR_\theta,所以我们取RθR_\theta的期望,记作Rθ\overline R_\theta,我们可以用Rθ\overline R_\theta来衡量actor的好坏,这个很好理解,即游戏中采取的行为直接影响游戏得分好坏:
在这里插入图片描述
我们定义每一局游戏即从游戏开始到结束,为τ={s1,a1,r1,s2,a2,r2,...,sT,aT,rT}\tau=\{s_1,a_1,r_1,s_2,a_2,r_2,...,s_T,a_T,r_T\},也就是一局游戏过程的序列,因为τ\tau是基于参数为θ\theta的神经网络的输出,每个τ\tau出现的概率就是P(τθ)P(\tau|\theta),所以我们的期望Rθ\overline R_\theta就是:
在这里插入图片描述
但是我们没办法穷举每一局游戏,我们只能进行采样,我们用actor去玩N局游戏,然后进行采样:
在这里插入图片描述
然后我们可以将期望近似为采样的均值,也就是将所有采样到的N局游戏奖励求和再取平均:
在这里插入图片描述
接下来我们就是要找出最好的actor:
在这里插入图片描述
我们要优化的就是期望,我们希望期望越大越好,我们可以用梯度上升法更新参数,其实原理跟梯度下降类似,只是一个是越大越好,一个是越小越好,具体可以看下图,还是比较好理解的:
在这里插入图片描述
我们前面定义了期望:
在这里插入图片描述
因为奖励是游戏本身设定的,我们可能是不知道的,所以梯度只作用于概率上那部分上:
在这里插入图片描述
因为要log,所以进行变换:
在这里插入图片描述
因为我们知道:
在这里插入图片描述
所以期望就是:
在这里插入图片描述
然后近似于N次采样:
在这里插入图片描述

那接下来怎么求这个梯度呢,我们知道P(τθ)P(\tau|\theta)是怎么来的:
在这里插入图片描述
在这里插入图片描述
我们看到跟θ\theta相关的就是中间连乘的那部分,因为你每次在某个时间t状态下采取的行动,是基于你的actor πθ\pi _\theta的,比如下面的例子,某个时刻t的状态下,要开火的概率是0.7:
在这里插入图片描述
因为有连乘,所以我们取log,得到:
在这里插入图片描述
所以梯度就跟中间累加项有关:
在这里插入图片描述
于是:
在这里插入图片描述
在这里插入图片描述
R(τn)R(\tau^n)作用于每一个梯度,所以可以乘进去,得:
在这里插入图片描述
我们的梯度上升是这样:
在这里插入图片描述
因此我们希望奖励的期望梯度越大越好,当R(τn)R(\tau^n)是正的时候,我们希望提高p(atnstn,θ)p(a_t ^n|s_t ^n,\theta),反之当R(τn)R(\tau^n)是负的时候,我们希望减小p(atnstn,θ)p(a_t ^n|s_t ^n,\theta),这样就才可以使得奖励的期望梯度尽可能的大:
在这里插入图片描述
这边为什么是考虑某一局游戏的奖励R(τn)R(\tau^n),而不是某个时间点的奖励呢τtn\tau_t ^n,因为如果仅仅考虑某个时间点,比如开火的时候,得到了奖励,那他就越提高开火的概率,训练之后可能会一直乱开火。

我们来看这个式子,为什么最后要是取log,其实我们把他还原回去,可以看到其实是除以了概率:
在这里插入图片描述
为什么要做这件事呢,因为加入某个状态在很多局游戏里出现,采取a的奖励是2,采取b的奖励1,但是会采取b的次数多,因为我们的梯度是会进行求和,所以算出来最后可能他会选择b,但是事实a应该是更好的,所以我们要把这个次数的影响给消除点,我们除以概率就可以了,比如下图a出现的概率是1/4,b出现的概率是3/4,把奖励除以对应的概率,最后算出来会提升a的概率从,所以可能选择a的概率大:
在这里插入图片描述
其实还有个问题,我们的R(τn)R(\tau^n)一直是正的,理论上好像没问题,比如下图的a,b,c三个概率,如果都是正的,假设a,c的奖励大,b的小,那三个概率都应该增加,但是概率大的其实反而概率是会减少的,因为概率的和是1,其他增加了多少了,增加少的就会减少:
在这里插入图片描述
但是实际上你可能没采样的a,然后导致a的概率降低了:
在这里插入图片描述
这个其实是有问题的,或许a是更好的选择,那怎么避免这种情况呢,我们可以设定一个门槛,一个基线b,超过他的我们才会把概率提高,这样b,c的概率也就不一定提高,a也不一定降低了:
在这里插入图片描述

总结

本篇主要介绍强化学习的基本概念和基于策略的方法,还有一些要注意的地方,其实挺值得我们思考的,也是我们今后可以优化的地方,其他的方法再后面会介绍。

好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵,图片来自李宏毅课件,侵删。

2019-04-07 16:09:03 qq_37764129 阅读数 418
  • Fast.ai 深度学习实战课程「中文字幕」

    本课程由 Jeremy Howard 教授开设,共8节。目的是让大家在不需要深入研究高水平数学问题的情况下,学习如何建立先进的深度学习模型。 Jeremy Howard 教授结合自己参加 Kaggle 大赛并夺魁的经验认为,传统学院派的教学方式对于大多数学习者来说已经不适用,应该以问题为引导,以实践为驱动,尽快切入到核心理论和核心工具的使用上,掌握深度学习优模型的构建方法。

    16210 人正在学习 去看看 AI100讲师

      深度学习大牛吴恩达曾经说过:做 AI 研究就像造宇宙飞船,除了充足的燃料之外,强劲的引擎也是必不可少的。假如燃料不足,则飞船就无法进入预定轨道。而引擎不够强劲,飞船甚至不能升空。类比于 AI,深度学习模型就好像引擎,海量的训练数据就好像燃料,这两者对于 AI 而言同样缺一不可。

  随着深度学习技术在机器翻译、策略游戏和自动驾驶等领域的广泛应用和流行,阻碍该技术进一步推广的一个普遍性难题也日渐凸显:训练模型所必须的海量数据难以获取。

  以下是一些当前比较流行的机器学习模型和其所需的数据量,可以看到,随着模型复杂度的提高,其参数个数和所需的数据量也是惊人的。

                   

在深度学习中,当数据量不够大时候,常常采用下面5中方法:

1. 人工增加训练集的大小.

通过平移, 翻转, 加噪声等方法从已有数据中创造出一批"新"的数据.也就是Data Augmentation(数据扩充)

这是解决过拟合最有效的方法,只要给足够多的数据,让模型「看见」尽可能多的「例外情况」,它就会不断修正自己,从而得到更好的结果:

      
如何获取更多数据,可以有以下几个方法:

从数据源头获取更多数据:这个是容易想到的,例如物体分类,我就再多拍几张照片好了;但是,在很多情况下,大幅增加数据本身就不容易;另外,我们不清楚获取多少数据才算够;
根据当前数据集估计数据分布参数,使用该分布产生更多数据:这个一般不用,因为估计分布参数的过程也会代入抽样误差。
数据增强(Data Augmentation):通过一定规则扩充数据。如在物体分类问题里,物体在图像中的位置、姿态、尺度,整体图片明暗度等都不会影响分类结果。我们就可以通过图像平移、翻转、缩放、切割等手段将数据库成倍扩充;

      不同的任务背景下, 我们可以通过图像的几何变换, 使用以下一种或多种组合数据增强变换来增加输入数据的量. 这里具体的方法都来自数字图像处理的内容, 相关的知识点介绍, 网上都有, 就不一一介绍了.

  • 旋转 | 反射变换(Rotation/reflection): 随机旋转图像一定角度; 改变图像内容的朝向;
  • 翻转变换(flip): 沿着水平或者垂直方向翻转图像;
  • 缩放变换(zoom): 按照一定的比例放大或者缩小图像;
  • 平移变换(shift): 在图像平面上对图像以一定方式进行平移; 
    可以采用随机或人为定义的方式指定平移范围和平移步长, 沿水平或竖直方向进行平移. 改变图像内容的位置;
  • 尺度变换(scale): 对图像按照指定的尺度因子, 进行放大或缩小; 或者参照SIFT特征提取思想, 利用指定的尺度因子对图像滤波构造尺度空间. 改变图像内容的大小或模糊程度;
  • 对比度变换(contrast): 在图像的HSV颜色空间,改变饱和度S和V亮度分量,保持色调H不变. 对每个像素的S和V分量进行指数运算(指数因子在0.25到4之间), 增加光照变化;
  • 噪声扰动(noise): 对图像的每个像素RGB进行随机扰动, 常用的噪声模式是椒盐噪声和高斯噪声;
  • 颜色变换(color): 在训练集像素值的RGB颜色空间进行PCA, 得到RGB空间的3个主方向向量,3个特征值, p1, p2, p3, λ1, λ2, λ3. 对每幅图像的每个像素Ixy=[IRxy,IGxy,IBxy]T进行加上如下的变化:

                                        [p1,p2,p3][α1λ1,α2λ2,α3λ3]T

      其中:αi是满足均值为0,方差为0.1的随机变量.

参考资料:

深度学习中的Data Augmantation方法(转)基于keras :https://www.cnblogs.com/love6tao/p/5841648.html

2. Regularization(规范化、正则化). 

通过在Loss Function 后面加上正则项(规范化项)可以抑制过拟合的产生.。规范化有时候被称为权重衰减(weight decay)或者L2规范化。以 L2 regularization为例,L2 规范化的想法是增加一个额外的项到代价函数上,这个项叫做规范化项

                                                                         C=C_0+\frac{\lambda}{2n}\cdot\sum_i{w_i^2}

      其中第一个项就是常规的代价函数的表达式第二个项就是所有权重的平方的和。然后使用一个因子 λ/2n 进行量化调整,其中 λ > 0 可以称为规范化参数,其中 n 就是训练集合的大小。需要注意的是,规范化项里面并不包含偏置

      规范化可以当做一种寻找小的权重和最小化原始的代价函数之间的折中。这两部分之前相对的重要性就由 λ 的值来控制了:λ 越小,就偏向于最小化原始代价函数,反之,倾向于小的权重

      训练过程需要降低整体的 Cost,这时候,一方面能降低实际输出与样本之间的误差 C_0 ,也能降低权值大小。缺点是引入了一个需要手动调整的hyper-parameter(超参数).

详见 https://www.wikiwand.com/en/Regularization_(mathematics)

3. Dropout(退出). 

          

这也是一种正则化手段. 不过跟以上不同的是它通过随机将部分神经元的输出置零来实现。在训练时,每次随机(如50%概率)忽略隐层的某些节点;这样,我们相当于随机从2^H个模型中采样选择模型;同时,由于每个网络只见过一个训练数据(每次都是随机的新网络),所以类似 bagging 的做法,这就是我为什么将它分类到「结合多种模型」中;

此外,而不同模型之间权值共享(共同使用这 H 个神经元的连接权值),相当于一种权值正则方法,实际效果比 L2 regularization 更好。

详见 http://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf

关于Dropout的原理介绍(好):https://blog.csdn.net/program_developer/article/details/80737724

原理解释的一般:http s://blog.csdn.net/stdcoutzyx/article/details/49022443

Dropout 层应该加在什么地方:Dropout 层一般加在全连接层 防止过拟合 提升模型泛化能力。而很少见到卷积层后接Drop out (原因主要是 卷积参数少,不易过拟合)

https://blog.csdn.net/qq_27292549/article/details/81092653

4. Unsupervised Pre-training. 

用Auto-Encoder或者RBM的卷积形式一层一层地做无监督预训练, 最后加上分类层做有监督的Fine-Tuning.

参考 http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.207.1102&rep=rep1&type=pdf

5.模型剪枝(Network Pruning)

      全连接有很强的逼近能力但是很容易导致过拟合。所以 机器学习与模式识别最核心的问题就是减小系统的复杂度(description -length【1】,VC-dimensions【2】),在神经网络中,这样的核心问题就变成了减少连接权值的数量。减小模型复杂度方面,很常见的方法是在损失函数后面加上惩罚项

论文中文翻译:https://blog.csdn.net/u013044310/article/details/80187998

理论介绍+代码:https://blog.csdn.net/jacke121/article/details/79450321

6、迁移学习

数据不够时的解决办法(一)——迁移学习

7、Early stopping:

      对模型进行训练的过程即是对模型的参数进行学习更新的过程,这个参数学习的过程往往会用到一些迭代方法,如梯度下降(Gradient descent)学习算法。Early stopping便是一种迭代次数截断的方法来防止过拟合的方法,即在模型对训练数据集迭代收敛之前停止迭代来防止过拟合。
      Early stopping方法的具体做法是,在每一个Epoch结束时(一个Epoch集为对所有的训练数据的一轮遍历)计算validation data的accuracy,当accuracy不再提高时,就停止训练。这种做法很符合直观感受,因为accurary都不再提高了,在继续训练也是无益的,只会提高训练的时间。那么该做法的一个重点便是怎样才认为validation accurary不再提高了呢?并不是说validation accuracy一降下来便认为不再提高了,因为可能经过这个Epoch后,accuracy降低了,但是随后的Epoch又让accuracy又上去了,所以不能根据一两次的连续降低就判断不再提高。一般的做法是,在训练的过程中,记录到目前为止最好的validation accuracy,当连续10次Epoch(或者更多次)没达到最佳accuracy时,则可以认为accuracy不再提高了。此时便可以停止迭代了(Early Stopping)。这种策略也称为“No-improvement-in-n”,n即Epoch的次数,可以根据实际情况取,如10、20、30……

原文:https://blog.csdn.net/chen645096127/article/details/78990928

 

 

 

 

没有更多推荐了,返回首页