欢迎光临
我们一直在努力

ssh证书登录

shenzt@sina.com阅读(287)

ssh 无密码登录要使用公钥与私钥。linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例。

有机器A(192.168.1.155),B(192.168.1.181)。现想A通过ssh免密码登录到B。

1.在A机下生成公钥/私钥对。

[chenlb@A ~]$ ssh-keygen -t rsa -P ”

-P表示密码,-P ” 就表示空密码,也可以不用-P参数,这样就要三车回车,用-P就一次回车。
它在/home/chenlb下生成.ssh目录,.ssh下有id_rsa和id_rsa.pub。

2.把A机下的id_rsa.pub复制到B机下,在B机的.ssh/authorized_keys文件里,我用scp复制。

[chenlb@A ~]$ scp .ssh/id_rsa.pub chenlb@192.168.1.181:/home/chenlb/id_rsa.pub
chenlb@192.168.1.181’s password:
id_rsa.pub                                    100%  223     0.2KB/s   00:00

由于还没有免密码登录的,所以要输入密码。

3.B机把从A机复制的id_rsa.pub添加到.ssh/authorzied_keys文件里。

[chenlb@B ~]$ cat id_rsa.pub >> .ssh/authorized_keys
[chenlb@B ~]$ chmod 600 .ssh/authorized_keys

authorized_keys的权限要是600

4.A机登录B机。

[chenlb@A ~]$ ssh 192.168.1.181
The authenticity of host ‘192.168.1.181 (192.168.1.181)’ can’t be established.
RSA key fingerprint is 00:a6:a8:87:eb:c7:40:10:39:cc:a0:eb:50:d9:6a:5b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘192.168.1.181’ (RSA) to the list of known hosts.
Last login: Thu Jul  3 09:53:18 2008 from chenlb
[chenlb@B ~]$

第一次登录是时要你输入yes。

现在A机可以无密码登录B机了。

小结:登录的机子可有私钥,被登录的机子要有登录机子的公钥。这个公钥/私钥对一般在私钥宿主机产生。上面是用rsa算法的公钥/私钥对,当然也可以用dsa(对应的文件是id_dsa,id_dsa.pub)

想让A,B机无密码互登录,那B机以上面同样的方式配置即可。

Linux 下执行定时任务 crontab 命令详解

shenzt@sina.com阅读(288)

Linux 下执行定时任务 crontab 命令详解

1、先来一个小小的例子

查看当前路径:

[root@root test]
/home/admin/test 
[root@root test]

查看当前用户的定时任务 也可以 crontab -uroot -l查看指定用户的定时任务。
千万不要忘了中间的 sh 表示用户拿什么来执行命令

00 02 * * * sh /home/admin/optbash/dailyBackup.sh
00 02 * * * sh /home/admin/optbash/deleteDebugSql.sh

建立一个用定时任务跑的bash脚本:

[root@root test]
[root@root test]

编辑如下内容,将系统当前时间输出到 console.txt 文件然后保存,增加可执行权限

/bin/echo `date` > /home/admin/test/console.txt
[root@root test]
total 8
-rw-r--r-- 1 root root 29 Mar 27 21:31 console.txt
-rwxr-xr-x 1 root root 48 Mar 27 21:28 test.sh
[root@root test]

追加 crontab 定时任务,每分钟触发:

[root@root test]# crontab -e
00 02 * * * sh /home/admin/optbash/dailyBackup.sh
00 02 * * * sh /home/admin/optbash/deleteDebugSql.sh
*  *  * * * sh /home/admin/test/test.sh

前面是已经存在的定时任务,后面执行test.sh脚本的是追加的
保存后提示已经装载了新的定时任务

"/tmp/crontab.HauiiV" 3L, 143C written
crontab: installing new crontab

再次查看定时任务列表,可以看到定时任务已经添加

[root@root test]
00 02 * * * sh /home/admin/optbash/dailyBackup.sh
00 02 * * * sh /home/admin/optbash/deleteDebugSql.sh
*  *  * * * sh /home/admin/test/test.sh
[root@root test]

查看console.txt有没有每分钟写入console.txt文件

[root@root test]# vim console.txt
Fri Mar 27 21:40:01 EDT 2015 

可以看到最近一次的写入时间。

2、看看crontab 的时间表达式

基本格式 :
*  *  *  *  *  command
分 时 日 月 周 命令

图片描述

然后来几个实际的例子:

1、每分钟执行一次            
*  *  *  *  * 

2、每隔一小时执行一次        
00  *  *  *  * 
or
* */1 * * *  (/表示频率)

3、每小时的15和30分各执行一次 
15,45 * * * * (,表示并列)

4、在每天上午 8- 11时中间每小时 15 ,45分各执行一次
15,45 8-11 * * * command (-表示范围)

5、每个星期一的上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 command

6、每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * command

3、其他命令介绍

名称 : crontab

使用权限 : 所有使用者

使用方式 :

crontab file [-u user]-用指定的文件替代目前的crontabcrontab-[-u user]-用标准输入替代目前的crontab.

crontab-1[user]-列出用户目前的crontab.

crontab-e[user]-编辑用户目前的crontab.

crontab-d[user]-删除用户目前的crontab.

crontab-c dir- 指定crontab的目录。 

4、crond 安装与配置服务

安装crontab:

yum install crontabs

服务操作说明:

/sbin/service crond start //启动服务

/sbin/service crond stop //关闭服务

/sbin/service crond restart //重启服务

/sbin/service crond reload //重新载入配置

查看crontab服务状态:

service crond status

手动启动crontab服务:

service crond start

查看crontab服务是否已设置为开机启动,执行命令:

ntsysv

加入开机自动启动:

chkconfig –level 35 crond on

28 天自制你的 AlphaGo(五)

shenzt@sina.com阅读(285)

28 天自制你的 AlphaGo(五):蒙特卡洛树搜索(MCTS)基础

 

蒙特卡洛树搜索(MCTS)是所有现代围棋程序的核心组件。在此之上可以加入各种小技巧(如 UCT,RAVE/AMAF,Progressive Bias,Virtual win & lose,Progressive Widening,LGR,Criticality 等等)和大改进(如 AlphaGo 的策略网络和价值网络)。

网上很少见到关于 MCTS 的详细介绍,而且许多看似详细的介绍实际有错误,甚至许多人会混淆蒙特卡洛树搜索和蒙特卡洛方法。这两者有本质区别。用做过渲染器的朋友会理解的话来说:蒙特卡洛方法有偏差(Bias),而MCTS没有偏差(Bias)。我们在后文会解释。

一、极小极大(Minimax)搜索

先看传统的博弈游戏树搜索,著名的极小极大(Minimax)搜索,学过算法的朋友会清楚。看下图,假设现在轮到黑棋,黑棋有b1和b2两手可选,白棋对于b1有w1和w2两手可选,白棋对于b2有w3 w4 w5三手可选:

28 天自制你的 AlphaGo(五):蒙特卡洛树搜索(MCTS)基础然后假设走完w1/w2/w3/w4/w5后,经过局面评估,黑棋的未来胜率分别是 50%/48%/62%/45%/58%(等一下,这些胜率是怎么评估出来的?我们后文会说这个问题)。

请问,黑棋此时最佳的着法是b1还是b2?如果是用蒙特卡洛方法,趋近的会是其下所有胜率的平均值。例如经过蒙特卡洛模拟,会发现b1后续的胜率是49% = (50+48)/2,而b2后续的胜率是55% = (62+45+58)/3。

于是蒙特卡洛方法说应该走b2,因为55%比49%的胜率高。但这是错误的。因为如果白棋够聪明,会在黑棋走b1的时候回应以w2(尽量降低黑棋的胜率),在黑棋走b2的时候回应以w4(尽量降低黑棋的胜率)。

所以走b1后黑棋的真实胜率是48%,走b2后黑棋的真实胜率是45%。黑棋的正解是b1。这就是 Minimax 搜索的核心思想:在搜索树中,每次轮到黑棋走时,走对黑棋最有利的;轮到白棋走时,走对黑棋最不利的。由于围棋是零和游戏,这就可以达到最优解。这是一个由底往上的过程:先把搜索树画到我们可以承受的深度,然后逐层往上取最大值或最小值回溯,就可以看到双方的正解(如果胜率评估是准确的)。而实际编程的时候,是往下不断生长节点,然后动态更新每个父节点的胜率值。

下图是一个更多层的例子:

28 天自制你的 AlphaGo(五):蒙特卡洛树搜索(MCTS)基础值得注意的是,在实际对局中,胜率评估会有不准确的地方,这就会导致“地平线效应”,即由于电脑思考的深度不够,且胜率评估不够准确,因此没有看见正解。

Minimax 搜索还有许多后续发展,如课本会说的 Alpha-beta 剪枝,以及更进一步的 Null Window / NegaScout / MTD(f) 等等。可惜这些方法更适合象棋等棋类,对于围棋的意义不大(除非已经接近终局),请读者思考原因。

蒙特卡洛树搜索和蒙特卡洛方法的区别在于:

如果用蒙特卡洛方法做上一百万次模拟,b1和b2的胜率仍然会固定在49%和55%,不会进步,永远错误。

而蒙特卡洛树搜索在一段时间模拟后,b1和b2的胜率就会向48%和45%收敛,从而给出正确的答案。

28 天自制你的 AlphaGo(五):蒙特卡洛树搜索(MCTS)基础二、蒙特卡洛树搜索

如果想把 Minimax 搜索运用到围棋上,立刻会遇到两个大问题:

搜索树太广。棋盘太大了,每一方在每一步都有很多着法可选。

很难评估胜率。除非把搜索树走到终局,这意味着要走够三百多步(因为对于电脑来说,甚至很难判断何时才是双方都同意的终局,所以只能傻傻地填子,一直到双方都真的没地方可以走为止)。简单地说,搜索树也需要特别深。

蒙特卡洛树搜索的意义在于部分解决了上述两个问题:

它可以给出一个局面评估,虽然不准,但比没有强

根据它的设计,搜索树会较好地自动集中到“更值得搜索的变化”(注意,也不一定准)

最后,随着搜索树的自动生长,蒙特卡洛树搜索可以保证在足够长的时间后收敛到完美解(但可能需要极长的时间)。下面看具体过程(需要指出,下图是网络上常见的一个图,但其实有错误):

28 天自制你的 AlphaGo(五):蒙特卡洛树搜索(MCTS)基础上图中每个节点代表一个局面。而 A/B 代表这个节点被访问 B 次,黑棋胜利了 A 次。例如一开始的根节点是 12/21,代表总共模拟了 21 次,黑棋胜利了 12 次。

我们将不断重复一个过程(很多万次):

这个过程的第一步叫选择(Selection)。从根节点往下走,每次都选一个“最值得看的子节点”(具体规则稍后说),直到来到一个“存在未扩展的子节点”的节点,如图中的 3/3 节点。什么叫做“存在未扩展的子节点”,其实就是指这个局面存在未走过的后续着法。

第二步叫扩展(Expansion),我们给这个节点加上一个 0/0 子节点,对应之前所说的“未扩展的子节点”,就是还没有试过的一个着法。

第三步是模拟(Simluation)。从上面这个没有试过的着法开始,用快速走子策略(Rollout policy)走到底,得到一个胜负结果。按照普遍的观点,快速走子策略适合选择一个棋力很弱但走子很快的策略。因为如果这个策略走得慢(比如用 AlphaGo 的策略网络走棋),虽然棋力会更强,结果会更准确,但由于耗时多了,在单位时间内的模拟次数就少了,所以不一定会棋力更强,有可能会更弱。这也是为什么我们一般只模拟一次,因为如果模拟多次,虽然更准确,但更慢。

第四步是回溯(Backpropagation)。把模拟的结果加到它的所有父节点上。例如第三步模拟的结果是 0/1(代表黑棋失败),那么就把这个节点的所有父节点加上 0/1。

三、重要细节

怎么选择节点?和从前一样:如果轮到黑棋走,就选对于黑棋有利的;如果轮到白棋走,就选对于黑棋最不利的。但不能太贪心,不能每次都只选择“最有利的/最不利的”,因为这会意味着搜索树的广度不够,容易忽略实际更好的选择。

因此,最简单有效的选择公式是这样的:

其中 x 是节点的当前胜率估计(注意,如前所述,要考虑当前是黑棋走还是白棋走!),N 是节点的访问次数。C 是一个常数。C 越大就越偏向于广度搜索,C 越小就越偏向于深度搜索。注意对于原始的 UCT 有一个理论最优的 C 值,但由于我们的目标并不是最小化“遗憾”,因此需要根据实际情况调参。

我们看例子说明这是什么意思,就看之前的图吧。假设根节点是轮到黑棋走。那么我们首先需要在 7/10、5/8、0/3 之间选择:

28 天自制你的 AlphaGo(五):蒙特卡洛树搜索(MCTS)基础如果 C 比较小,我们将会选择 7/10,接着就要在 2/4 和 5/6 间选择。注意,由于现在是白棋走,需要把胜率估计倒过来:

那么我们下一步肯定应该选 2/4。所以说之前的图是错误的,因为制图的人并没有注意到要把胜率倒过来(有朋友会说是不是可以认为它的白圈代表白棋的胜率,但这样它的回溯过程就是错的)。

最后,AlphaGo 的策略网络,可以用于改进上述的分数公式,让我们更准确地选择需扩展的节点。而 AlphaGo 的价值网络,可以与快速走子策略的模拟结果相结合,得到更准确的局面评估结果。注意,如果想写出高效的程序,这里还有很多细节,因为策略网络和价值网络的运行毕竟需要时间,我们不希望等到网络给出结果再进行下一步,在等的时候可以先做其它事情,例如 AlphaGo 还有一个所谓 Tree policy,是在策略网络给出结果之前先用着。

相信大家现在就可以写出正确的 MCTS 程序了(注意:最终应该选择访问量最大的节点,而不是胜率最高的节点,简单地说是因为访问量最大的节点的结果更可靠)。如果要写一个高效的程序,你会发现必须自己写一个内存池。关于 MCTS 还有很多话题可以说,这篇就到这里吧。

 

28天自制你的AlphaGo(三)

shenzt@sina.com阅读(253)

28天自制你的AlphaGo(三):对策略网络的深入分析以及它的弱点所在

本文作者:彭博 2017-02-21 11:58
导语:围棋中的人机对抗远没有结束。

一、神经网络在围棋中的历史

再次回顾 AlphaGo v13 的三大组件:

MCTS(蒙特卡洛树搜索)

CNN (卷积神经网络,包括:策略网络 policy network、快速走子网络 playout network、价值网络 value network)

RL (强化学习)

在上世纪90年代初期,大家就已经开始实验将神经网络(当时是浅层的)与强化学习应用于棋类游戏。最著名的例子是西洋双陆棋 Backgammon 的 TD-Gammon,它在自我对弈了150万局后,就达到了相当强的棋力,摘选 Wikipedia 中的一段:

Backgammon expert Kit Woolsey found that TD-Gammon’s positional judgement, especially its weighing of risk against safety, was superior to his own or any human’s.

TD-Gammon’s excellent positional play was undercut by occasional poor endgame play. The endgame requires a more analytic approach, sometimes with extensive lookahead. TD-Gammon’s limitation to two-ply lookahead put a ceiling on what it could achieve in this part of the game. TD-Gammon’s strengths and weaknesses were the opposite of symbolic artificial intelligence programs and most computer software in general: it was good at matters that require an intuitive “feel”, but bad at systematic analysis.

28天自制你的AlphaGo(三):对策略网络的深入分析以及它的弱点所在

简单地说,就是”大局观”特别强(比当时所有人类都强,不过,后来人也学习它的招法,人也进步了!),但是”官子弱”。这恰好和许多围棋 AI 给人的感觉完全一致。

然而神经网络(浅层的)在围棋中的应用却遇到很大的困难。例如90年代就有一个神经网络围棋叫 NeuroGo:The Integration of A Priori Knowledge into a Go Playing Neural Network 它的架构(如下图)也经过不少考虑,但棋力很低,10K的水平:

28天自制你的AlphaGo(三):对策略网络的深入分析以及它的弱点所在

二、策略网络的工作原理

究其原因,我们看策略网络的输入(很多年来大家使用的输入都大同小异,最重要的是把棋子按气的口数分类,如1口气的,2口气的,3口气的,4口和更多气的):

28天自制你的AlphaGo(三):对策略网络的深入分析以及它的弱点所在

策略网络的目的,简单说是快速预测双方的下一手的位置,类似于棋手的第一感。实际上,策略网络的第一层是类似于这样的规则的集合(为方便非程序员理解,这里举一个特别的例子):

“如果这个位置的上面有一个1口气的对方棋子,左下区域的2口气以上的本方棋子密度为某某某,右边某某区域本方的棋子密度按气加权为某某某,……,那么将以上事实加权算出有xx%的几率在这里落子”

看上去,这种规则更像是能预测某些局部的棋形情况,不像能准确地预测下一手。现代的围棋策略网络为何取得大的进展,是因为使用了 卷积神经网络 + 深度神经网络 的思想。

如果我们只看 AlphaGo v13 的第一层和最后一层神经网络,那么它的运作是:

1. 使用了 192 条类似的规则(由棋谱自动训练出来)(规则的数量太少固然不行,太多也会慢同时容易走入误区),然后在全棋盘扫描每个点(这就是卷积神经网络的思想),计算由所有规则综合得到的权值。

2. 再输入“1×1卷积核”网络(通俗地说,就是将每个点的上面算出的 192 种模式权值综合考虑,得出最终的落子几率),算出棋盘每个点作为走子的几率。如果也举个特别的例子,这类似于:

“如果要判断是否在这里走一个子,就会将【这里符合 A模式的程度】*0.8,【这里符合 B模式的程度】*0.4,【这里符合 C模式的程度】*(-0.2),等等等等,综合考虑,得出一个落子机率。”

3. 上述具体的训练过程,就是每见到一个情况就加强这个情况的权值。因此越经常出现的情况就会越被加强。

三、深度神经网络为何有效

如果只有两层网络,在看棋谱时,对于对弈者的下一手的位置,只能达到 35% 左右的正确率:cs.utoronto.ca/

但是,通过使用深度神经网络,也就是多层的网络,AlphaGo v13 可以达到 55% 左右的预测正确率。这有两个原因:

一,是概念层面的。举例,人在选点时,会考虑附近的双方棋子的”厚薄”,但”厚薄”是个高级概念,大致可以认为是棋块的”安定性”与”棋形”的结合。那么我们可以想象,如果第一层的规则,包括一部分专门负责”安定性”的规则,和一部分专门负责”棋形”的规则,再往上一层就可以通过加权考虑这两种规则的结果,得出类似”厚薄”的概念。然后再往上一层,就可以再运用之前得出的棋盘每个位置的”厚薄”情况,进行进一步的决策。

深度神经网络的最有趣之处在于,并不需要特别告诉它存在这样的概念的层次,它会自动从数据中形成这样的层次。

二,与棋盘和卷积神经网络的性质有关。第一层的规则,最好是局部的规则,因为这样的规则的泛化能力较高。譬如 AlphaGo v13 第一层使用的是 5×5 的局部,然后在第二层中再考虑 3×3 个 5×5 的局部,由于这些 5×5 的局部之间有重叠部分,就会形成一个 7×7 的局部。通过一层层往上加,最终可覆盖整个 19×19 的棋盘(如果你喜欢,可以继续往上加)。这符合我们的一种直觉:棋形会从里向外辐射一层层的影响,先看 5×5 ,然后看看周边的棋子就是 7×7 的情况,然后继续看下去。

四、新发展:残差网络

自然的问题是,如果这么说,是不是层越多就越好?

从前大家认为不是,因为太多层后很难训练,有时在训练集上的准确度已经会变差。

但是,如果仔细想想,这有点问题。我们不妨假设新加的一层就是一个不变变换,就是什么都不改变,就把上一层的输入做为输出。那么,此时的模型不会变好也不会变差。换而言之,增加层数,是永远不应该变差的!(这里的意思是,在训练集上的准确度不应该下降。在测试集上的准确度可能会由于过拟合而下降)

这就是 ResNet 残差网络的思想: 通过使用它,网络可以加到上千层也没有问题,几乎是一个免费的午餐:

28天自制你的AlphaGo(三):对策略网络的深入分析以及它的弱点所在

通过运用残差网络和少量 MCTS 模拟,策略网络的准确度可达 58% 以上:https://openreview.net/pdf?id=Bk67W4Yxl 。这近乎于理论最高值了,因为人的走棋不完美,同样的局面可以有不同的走法。

五、策略网络的弱点

然而策略网络是有弱点的。我在此更具体地说明几种情况。

第一,学习的棋谱数量有限,因此会有未见过的局面;同时,有时会知其然而不知其所以然,只学到了表面。这个问题很有趣,譬如,很多人发现 Zen6 (包括 DeepZenGo)有时会在征子上短路。下图是 2016/11/27 07:43 日 EWZGDXFEZ 与 Zen19L 在 KGS 的对局,黑棋是 Zen19L,走出了惊世骇俗的一步 M4,并认为自己的胜率高达 70% 以上:

28天自制你的AlphaGo(三):对策略网络的深入分析以及它的弱点所在

结果被白棋直接在 N4 征死(同时胜率立刻掉到17%…)。这到底是为什么?我们可以打开 Zen6 的策略网络显示(Hotspots 菜单):

28天自制你的AlphaGo(三):对策略网络的深入分析以及它的弱点所在

非常有趣。Zen6 认为白棋最可能的下一步是在 G2(概率大小是按红橙黄绿蓝紫排列,最不可能的是无色),而 N4 是它眼中白棋最不可能下的棋。它根本想不到白棋会走 N4。这个问题的成因是明显的:

在人类高手的对弈中,很少出现一方对另一方进行征子,因为另一方会预先避免对方征子成功。而策略网络在学习中,却不可能看到如此高的概念,它只能看到,如果有一方走出看似可以被征的棋形,另一方不会去征,于是,它所学到的,就是大家都不会去征对方的子。

著名的第 78 手与此也有类似的原因(区别是隐蔽得多)。同样,机器很难理解人为什么会”保留”,因为人”保留”的原因是另一个层次的(例如作为劫材)。当然,人的”保留”也不见得都对。

解决这个现象,初级的办法是加入手动的处理,更好的办法是通过自我对弈学习更多的局面。AlphaGo 比其它各路狗强大的重要原因,在于经过了上亿盘的左右互搏学习,见过的局面太多了。

第二,由于输入中缺乏对于多口气的精确区分(请思考为什么没有精确区分),可以说它不会精确数气,对于对杀和死活容易犯晕。这一般可以被蒙特卡洛树搜索纠正,但总会有纠正不了的情况。不过,虽然其它各路狗在此都经常会犯错,但 Master 却还没有被人抓到,有可能在于它已经学会有意避免这种局面,就像传说它会有意避免某些大型变化。

第三,靠感觉是不会精确收官和打劫,因此许多狗的官子和打劫有缺陷(换而言之,人可以靠官子和打劫逆转)。不过目前看来 AlphaGo 的新版已经专门为此做过额外处理,不会让人抓到这么明显的漏洞。我的一个猜测是,新版 AlphaGo 可能也建立了一个以”赢的子数”作为目标的价值网络,并且在适当的时候会参考它的结果。

许多人可能会很好奇,为什么各路狗都是用”胜率”而不是”赢的子数”作为目标。这是因为大家发现以”胜率”为标准,得到的胜率更高(这看似是废话,其实不是废话)。说到这个,我见过网上有人提为什么不在稳赢的时候改变贴目,尽量赢得更多一些,棋走得更好看;这个想法其实大家早就试过了,叫 Dynamic Komi 动态贴目,后果也是会稍微降低胜率。

不过,电脑的保守,有时候可以被人类利用。譬如,在电脑的棋有潜在缺陷的时候,可以先故意不走,等到收官阶段,电脑认为必胜(并且退让了很多)的时候再走,让电脑措手不及。最近陈耀烨就通过类似的办法连赢了国产狗好几盘,而 DeepZenGo 也被某位棋手抓到了一个漏洞连赢了好几盘(而这两位狗对付其它职业棋手的胜率已经相当高了)。围棋确实很有趣。我相信人机对抗并没有结束,还会继续下去,因为双方都会不断进步。

 

28天自制你的AlphaGo(四)

shenzt@sina.com阅读(264)

28天自制你的AlphaGo(四):结合强化学习与深度学习的Policy Gradient(左右互搏自我进化的基础)

本文作者:彭博 2017-02-23 13:54
导语:强化学习在 AlphaGo 中究竟是怎么用的?

 

本篇提前回答一个大家经常问的问题:强化学习在 AlphaGo 中究竟是怎么用的?比如说,SL策略网络,是怎么变成 RL 策略网络的?

| Policy Gradient:简单而有效

很有意思的是,很少见到有人回答上述问题(可能是因为 AlphaGo 论文在此写得很简略)。其实,这个问题的答案特别简单:

  • 如果我赢了棋,就说明这次我选择的策略是正确的。所以可以对于这次所经历的每一个局面,都加强选择这局的走法的概率。
  • 如果我输了棋,就说明这次我选择的策略是错误的。所以可以对于这次所经历的每一个局面,都减少选择这局的走法的概率。

举个例子,比如说电脑左右互搏,黑棋开局走星位,白棋回应走小目,最后白棋输了,那么黑棋就加强开局走星位的概率(以及后续的每一步选择这局的走法的概率),白棋就减少在黑棋开局走星位的情况下走小目的概率(以及后续的每一步选择这局的走法的概率)。

等一下,这里好像有问题。这是不是太傻了?也许白棋并不是败在开局,而是败在中盘的某一步?也许黑棋并不是真的这次走对了策略,而是白棋看漏了一步(而且白棋如果走对是可以赢的)?

以上说的很正确。但是,反过来想,如果黑棋的走法可以让白棋后面打勺的概率增加,那也不错啊。另一方面,如果白棋发现自己目前的策略容易进入自己不容易掌握的局面,那么尽管确实可能有完美的招数隐藏在里面,那白棋也不妨一开始就去避免这种局面吧。而且,胜和负的影响可以相互抵消,所以在经过大量对局后,这个过程是比较稳定的。比如说如果某个开局的后续胜率经统计是50%,那它就不会被改变;但如果不是50%,这种改变就有一定道理。

这个过程,有点像人类棋手的“找到适合自己的棋风”的过程。毫无疑问,现在的 AlphaGo 已经找到了十分适合自己的棋风,它确实是会扬长避短的。

以上是最简单的 Policy Gradient 的例子,它的问题是有可能陷入局部的最优(对付自己有效,不代表对付其他人有效),因此 AlphaGo 论文中会建立一个对手池(包括整个进化过程中形成的所有策略),保证新策略尽量对于不同对手都有效。在这个基础上,可以做各种各样的改进,例如配合未来的价值网络,更清楚地看到自己的败着在哪里,而不是傻傻地把所有概率都同样修改 。

| Deepmind 的相关研究

其实 Deepmind 自创始以来就在做类似的研究,在此简单说说。经典的一系列论文是学会玩 Atari 游戏:

Playing Atari with Deep Reinforcement Learning

Human-level control through deep reinforcement learning

例如最经典的 Pong:

28天自制你的AlphaGo(四):结合强化学习与深度学习的Policy Gradient(左右互搏自我进化的基础)

这里也有一个策略网络,它输入的是目前的屏幕图像(实际上要输入几幅图像,或者前后两幅图像的差,用于判断运动情况),输出的是此时应该往上移动的概率。用这里所说的训练方法就可以让它无师自通,自己学会玩游戏,最终达到相当高的水准(可以想象,这个学习过程会比较慢)。

但是如果我们仔细想想,这个办法恐怕很难自己学会玩好星际!一个重要原因是星际的决策中有太复杂的“层次结构”。因此尽管 Deepmind 此前说星际是下一个目标,目前我们尚未看到 Deepmind 在这方面发表的进展。如果真的成功实现,将是相当大的成就。

最后,如果对于这方面感兴趣,这是一篇很好的介绍:

Deep Reinforcement Learning: Pong from Pixels

 

28 天自制你的 AlphaGo(二):训练策略网络,真正与之对弈

shenzt@sina.com阅读(280)

28 天自制你的 AlphaGo(二):训练策略网络,真正与之对弈

导语:这篇我们安装 TensorFlow,真正训练一下 AlphaGo v13 的 policy network,并且你还可以与它真正对弈。

上次我们介绍了围棋基础和如何搭建深度学习环境,这篇我们安装 TensorFlow,真正训练一下 AlphaGo v13 的 policy network,并且你还可以与它真正对弈,因为前几天已经有网友在做可以运行的 AlphaGo v13 的简化版:brilee/MuGo。所以这个过程真的已经很傻瓜化,毫不夸张地说,人人都可以拥有一只小狗了,只要你把棋谱喂给它,它就能学到棋谱的棋风。(本文是给大家快速找到感觉,后续我们会从头写代码,因为这位网友的代码真的很多 bug)

如果还没有装 CUDA 等等,请看前一篇《28 天自制你的 AlphaGo(一)》装好,记得把 cudnn 解压到 CUDA 的目录。TensorFlow 最近开始原生支持 Windows,安装很方便。

一、Windows 的安装

  • 1. 在上一篇我们装了 Anaconda Python 2.7,而 TensorFlow 需要 Python 3.5,不过两者在 Windows 下也可以共存,具体见:Windows下Anaconda2(Python2)和Anaconda3(Python3)的共存
  • 2. 按上文切换到 Python 3,然后一个命令就可以装好:tensorflow.org/versions/。例如 GPU 版本目前是:pip install –upgrade storage.googleapis.com。但是,你很可能会遇到 404 错误,那么可以把这个文件用迅雷下载下来,然后 pip install 文件名 即可。
  • 3. 装完后检验一下。首先进 python 然后 import tensorflow 然后 hello = tf.constant(‘Hello, TensorFlow!’) 然后 sess = tf.Session() 然后 print(sess.run(hello))。
  • 4. 然后 python -m tensorflow.models.image.mnist.convolutional 测试训练 MNIST 模型(一开始也会下载数据文件,比较慢)。

二、Mac 的安装

再看看 Mac 的安装。我是 OSX 10.11。

  • 1.首先 sudo easy_install pip 然后 sudo easy_install –upgrade six 然后 pip install tensorflow-gpu 即可。
  • 2. 可能需要再执行 sudo ln -s /usr/local/cuda/lib/libcuda.dylib /usr/local/cuda/lib/libcuda.1.dylib ,否则 import tensorflow 会报错。
  • 3. 用一样的办法检验一下安装是否成功。

三、训练策略网络

激动人心的时刻到了,我们开始真正训练 policy network。下面都以 Windows 下面的操作为例。

1. 把网友做好的 AlphaGo v13 简化版下载下来:brilee/MuGo 。然后 pip install 了 argh 和 sgf。注意 gtp 要额外装:jtauber/gtp (下载下来后用 easy_install . 装)。

2. 然后下载一些用于学习的棋谱。围棋棋谱的通用格式是 SGF。比如,就下载 KGS 的对局棋谱吧:u-go.net 。我没有统计过,不过上面大概有十万局吧。从原理上说,棋谱越多,训练的质量就越有保证;但是,棋谱中对弈者的水平参差不齐,如何控制这一变量,做过深度学习的朋友心中会有答案。本篇先不谈技术细节,我们先继续走。

3. 下面提取棋谱的特征,并将其分类为训练集和测试集。先建立 data 子目录,把 SGF 拷贝进去。例如下载 2014 年的 13029 局棋谱,解压到 data 下面是 kgs-19-2014,那么就执行

python main.py preprocess data/kgs-19-2014

截至今天为止,你会发现它写的 chunk 比预想少很多,所以生成的训练数据很少。具体来说,棋谱的让子大于 4 会崩溃,棋谱没有写明贴目会崩溃,有时候棋谱里面的 [tt] 其实也代表 PASS,等等。做为作业,请自己一个个修复吧! SGF 格式的说明在此:SGF file format FF

4. 再建立一个 tmp 目录,然后开始训练 1 个周期:

python main.py train processed_data –save-file=tmp\savedmodel –epochs=1 –logdir=logs\my_training_run

5. 你会发现策略网络的预测准确率开始从 0 慢慢上升了! 然后可以随时继续训练,比如说继续训练 10 个周期就是:

python main.py train processed_data –read-file=tmp\savedmodel –save-file=tmp\savedmodel –epochs=10 –logdir=logs\my_training_run

28 天自制你的 AlphaGo(二):训练策略网络,真正与之对弈

6. 训练的时候,可以再开一个命令行,激活 python3,然后 tensorboard –logdir=logs 然后在浏览器打开 http://127.0.0.1:6006/ 可以看到训练的过程:

28 天自制你的 AlphaGo(二):训练策略网络,真正与之对弈

7. 一直训练到准确率增加缓慢为止,应该可以到接近 60%。

8. 测试一下走棋(如果你会 GTP 协议):python main.py gtp policy –read-file=tmp\savedmodel 这是纯网络输出。如果把 policy 改成 mcts 就是加入了蒙特卡洛树搜索的,棋力更高(但是截至今天为止,你执行会发现立刻退出,这位网友的程序 bug 真是太多了,我们以后再重写)。

9. 如果不会 GTP,还是下载 GoGui 围棋图形界面吧: Download GoGui from SourceForge.net 。然后执行:”C:\Program Files (x86)\GoGui\gogui-twogtp.exe” -black “python main.py gtp policy –read-file=tmp\savedmodel” -white “C:\Program Files (x86)\GoGui\gogui-display” -size 19 -komi 7.5 -verbose -auto,但是截至今天为止,你会发现它很快就报错退出……

10. 这是因为截至今天为止,代码有个 bug 是 strategies.py 的第 95 行的函数要改成 is_move_reasonable(position, move) 。然后……你亲手制造的小狗就可以运行了! 黑棋是小狗:

28 天自制你的 AlphaGo(二):训练策略网络,真正与之对弈

Behold,小狗已经学会了守角! 不过现在他还特别弱,因为没有搜索,容易死活出问题。

11. 如果不会下围棋,让 GnuGo 来玩玩吧,下载链接:gnugo.baduk.org/,比如解压到 C:\gnugo\gnugo.exe ,然后执行:”C:\Program Files (x86)\GoGui\gogui.exe” -size 19 -computer-both -auto -program “C:\Program Files (x86)\GoGui\gogui-twogtp.exe -black “”C:\gnugo\gnugo.exe –level 1 –mode gtp”” -white “”python main.py gtp policy –read-file=tmp\savedmodel”” -games 1 -size 19 -alternate -sgffile gnugo -verbose” 即可。你会发现下到后面也会崩溃,如果打开 GTP Shell 看看,是因为小狗还无法理解对方的 PASS,哈哈。

于是,这篇就到此吧,我们下一篇见。

28 天自制你的 AlphaGo(一)

shenzt@sina.com阅读(272)

28 天自制你的 AlphaGo(一)

一、围棋 AI 基础

大家都知道 AlphaGo v13 的三大组件是:

  • MCTS(蒙特卡洛树搜索)
  • CNN (卷积神经网络,包括:策略网络 policy network、快速走子网络 playout network、价值网络 value network)
  • RL (强化学习)

现有的围棋 AI 也都是这个思路了,我们也会按这个思路讲。在此先看看围棋和博弈 AI 的一些基本常识。

1、首先是围棋规则。

围棋博大精深,但基本规则很简洁。推荐这个在线教程:

  • 第一天 围棋的介绍 – 十天即可掌握!『PANDANET围棋入门』

注意,正常来说,黑棋的第 1 手要下到你的右上角,比如说右上角的”星位”或者”小目”。虽然棋盘是对称的,下其它三个角也可以,但这是对弈的一种礼貌,这样下对方就知道你是懂规矩的(当然,也可以第 1 手下在边上,或者中腹,但目前人类一般认为是亏的)。

如果等不及,看完教程的”第一天”内容,其实就可以立刻玩一下了。下图是纯神经网络走棋,你持黑,电脑持白(因为黑棋先走,有优势,所以最后要倒贴几目给白棋,叫做贴目),大家可以点击打开:

  • Play Go Against a DCNN

这个网页第一次打开会比较慢,因为要加载一个 50M 的神经网络数据。

28 天自制你的 AlphaGo(一)图中的颜色可以点击 “Show Analysis” 打开,是神经网络的最终输出。越红的地方,代表神经网络认为越可能成为下一手。你也可以把 “Auto Move” 关掉,自己和自己下。

试试先按电脑的建议,走在红的地方,培养一下”感觉”吧!

如果有多个红点,可以任选一个。当然,不可迷信,它的红点时常是错的,也时常不全面!

这个电脑不会计算,完全没有搜索,全部都是靠神经网络的“感觉”,用围棋的话说,可以说是按照”定式”和”常型”等等,所以死活弱(就是你可能会有机会把它的棋吃掉!),很适合新人找感觉。

2、围棋规则实际有很多细节,而且并没有世界统一的规则。

现有的规则有中国、韩国、日本、应式等等,在大多数情况下不影响胜负的判断结果,但还是有微妙区别,比如说中国是数子,有”粘劫收后”,日韩是数目,终局有死活的判断问题。

较为简洁,适合电脑描述的可能是 Tromp-Taylor 规则: Tromp-Taylor Rules。不妨做几个调整:

a. 再简化一点,去掉”全局禁同形再现”,改成”罕见循环局面由裁判决定”(毕竟三劫以上循环的可能性很小),这样程序就不一定要存一个每个局面的hash表。

b. 禁止自杀,这样更接近其它规则。

c. 虽然目前看最佳贴目可能更接近 5.5,但还是按中国现有规则的 7.5 吧,方便大家统一。

目前市面最强的程序是 银星17 和 Zen6,不过价钱也比较高(虽然都有X版)。而目前免费软件中最强的是 Leela,棋力也还不错,请点击:chess, audio and misc. software

而且 Leela 有 console 的接口,可以接上目前常用的围棋 GTP 协议。如果你有兴趣,现在还有一个电脑围棋的天梯,可以连进去与其它程序对战,看自己的排名: 19×19 All Time Ranks。

3、关于蒙特卡洛树搜索

有一个常见的错误认识,在此先纠正。

在棋类博弈 AI 中,很多年前最早出现的是蒙特卡洛方法,就是到处随机走,然后看哪里的胜率最高。但这有一个问题,举个例子:

a. 如果走在 A,人有100种应对,其中99种,电脑会立刻赢,只有1种电脑会立刻输。

b. 如果走在 B,人有100种应对,但局势很复杂,大家都看不清,如果随机走下去,后续的胜率双方都是50%。

那么如果计算蒙特卡洛的胜率,电脑会发现走在 A 的胜率是 99%,走在 B 的胜率是 50%。

可是,电脑的正解是应该走 B!因为如果走了 A,人如果够聪明,就一定会走电脑立刻输的变化。如果电脑执意要走 A,就只能称之为”骗着”了。

于是有的人会说蒙特卡洛方法有缺陷。但是,蒙特卡洛树搜索在理论上解决了这个问题。

怎么把人想象得尽量聪明?这就要靠博弈树。蒙特卡洛树搜索是博弈树和蒙特卡洛方法的结合,它不会犯 A 和 B 的问题,它很快就会发现 B 比 A 好。容易证明,如果给定足够的计算时间和足够的存储空间,蒙特卡洛树搜索可以收敛到完美的博弈树,成为围棋之神。

然而,实际的计算和存储资源是有限的,实际的 A (不妨称之为陷阱)也会更复杂。比如说:

c. 如果走在 A,经过博弈树的模拟,电脑几乎是怎么走都怎么赢;但是人更清楚后续的走法,人会走出完美的应对,在许多步后电脑一定会突然死亡。

这时,电脑要走遍了博弈树的许多层,才能发现原来走到 A 会存在致命缺陷,掉入陷阱。这种情况下,蒙特卡洛树搜索就容易在 A 和 B 的问题上给出错误的答案。这有好多种表现,比如说”地平线效应”,又像 AlphaGo 被击中的第 78 手。

围棋中是有很多陷阱局面的,比如说”大头鬼”。人工智能如何正确应对陷阱局面,或者避免进入陷阱局面?这就需要 策略网络(policy network)、价值网络(value network)、强化学习 的共同作用。在后续的文章将会逐步介绍,包括具体的训练方法。

二、安装 MXNet 搭建深度学习环境

介绍完围棋 AI 的基本常识,咱们开始搭建深度学习环境。

目前的环境很多,最多人用的是 Google 的 TensorFlow;不过 MXNet 感觉也蛮不错,比较省资源(当然,最好两个都装)。配图是 MXNet 的例子里面的 LeNet 训练 MNIST 数据集,这是很经典的模型,可以看到准确率在随着训练不断提高:

28 天自制你的 AlphaGo(一)安装之前先看个好玩的:github.com/dmlc/mxnet.js是在浏览器直接运行 MXNet 的效果。TensorFlow 也有类似的东西:transcranial/keras-js。也就说,我们训练好模型后,可以直接在网页里面可视化,这样就可以轻松跨平台。

28 天自制你的 AlphaGo(一)1、Windows的安装

第一次装深度学习环境经常会遇到一些坑,这里看一个实际安装 MXNet 的过程。先看 Windows 的安装,比较简单和快速,因为不需要编译。

说句无关的,我个人是推荐 Windows 的,因为显卡还可以用于娱乐(这几年的新游戏的图像进步很大),有兴趣还可以玩个 VR 啥的。

  • 1) 首先装了 VC2015,安装时语言记得选上 C++。
  • 2)然后如果你有 nVidia 的 GPU,装一下 CUDA:CUDA 8.0 Downloads
  • 3)再下载 cuDNN,这个要注册一个帐号。注册一个吧: NVIDIA cuDNN
  • 4)下载 MXNet 的编译好的包:github.com/
  • 5)装个 Python 吧,推荐 Anaconda,选 Python 2.7 的版本: Download Anaconda Now!
  • 6)进开始的 MXNet 目录的 python 子目录,执行 python setup.py install 。会发现提示要装一个 Microsoft Visual C++ Compiler for Python 2.7,去装了。
  • 7)然后再执行 python setup.py install,可能会发现提示缺头文件,把他们从你的 VC2015 的 include 目录拷贝到 Microsoft Visual C++ Compiler for Python 2.7 的 include 目录即可。要根据提示拷贝好几个头文件。然后就可以成功编译了。
  • 8)运行 python,然后 import mxnet 然后 (mxnet.nd.ones((2,2), mxnet.cpu)*100).asnumpy然后 (mxnet.nd.ones((2,2), mxnet.gpu)*100).asnumpy 如果全部成功,恭喜你,装好了。
  • 9)再下载 dmlc/mxnet
  • 10)再测试 VC++ 的环境。下载 MXNet.cpp
  • 11)可以用 CPU-z 和 GPU-z 看你的 CPU 和 GPU 有没有偷懒,是否是在全心全意工作。

2、Mac 的安装

下面看 Mac 的安装,我是 OSX 10.11。

这个安装麻烦一些,因为首先下面有些下载过程可能要 export ALL_PROXY=”代理地址”(否则很慢)。另外 pip 也要换国内源,git 也要加代理,homebrew 也可以改国内源。

然后有时会遇到权限问题,请 chown 一下。有时可能也要 sudo。

  • 1)装 XCode。最新 CUDA 已经兼容 XCode 8 了。
  • 2)装 CUDA 和 cuDNN。
  • 3)装 homebrew(百度搜索一下)。装 python,建议 brew install pyenv 然后用它装 anaconda2,防止破坏系统 python 版本:Mac OS X下安装pyenv

注:如果发现 pyenv 下载文件奇慢无比,可以给 pyenv 加上 -v 看到找到下载路径,然后手工下载,然后打开 /usr/local/bin/python-build 然后在 download_tarball 函数里面,直接把第一行改成 local package_url=”http://127.0.0.1/Anaconda2-4.2.0-MacOSX-x86_64.sh” 然后你自己开一个 http 服务器即可。

  • 4)装 MXNet: Installing MXNet on OS X
  • 5)按它说的编译(非常慢)。在 config.mk 中加:

USE_BLAS = openblas

ADD_CFLAGS += -I/usr/local/opt/openblas/include

ADD_LDFLAGS += -L/usr/local/opt/openblas/lib

ADD_LDFLAGS += -L/usr/local/lib/graphviz/

USE_CUDA = 1

USE_CUDA_PATH = /usr/local/cuda

USE_CUDNN = 1

USE_NVRTC = 1

另外可能要 ln -s /usr/local/cuda/lib /usr/local/cuda/lib64 。有问题就 make clean 一下再试试。

  • 6)检查是否装好:

cd example/image-classification/

python train_mnist.py

祝安装成功!在下一篇我们会看看从棋谱提取训练特征。

小作业:

1. 介绍围棋基础的纯神经网络走棋是开源的,请改它的代码,做一个基本的围棋界面,包括吃子、打劫、点目等等基本规则。

2. 请阅读它的论文: http://jmlr.org/proceedings/papers/v37/clark15.pdf 。

3. 请做一个傻瓜版的 策略网络,比如说会做眼,会吃子。可以参考 GnuGO 的 6. Move generation 。

4. 请做一个傻瓜版的 价值网络,比如说可以用”棋子向外辐射影响”的方法。可以参考 GnuGO 的 13. Influence Function 和 Bouzy’s 5/21 algorithm 。

八大免费SSL证书-给你的网站免费添加Https安全加密

shenzt@sina.com阅读(236)

八大免费SSL证书-给你的网站免费添加Https安全加密

八大免费SSL证书-给你的网站免费添加Https安全加密

SSL证书,用于加密HTTP协议,也就是HTTPS。随着淘宝、百度等网站纷纷实现全站Https加密访问,搜索引擎对于Https更加友好,加上互联网上越来越多的人重视隐私安全,站长们给网站添加SSL证书似乎成为了一种趋势。

给自己的网站添加SSL证书其实并不复杂,但是关键一点就是首先要拥有一个SSL证书。由于SSL证书价格不菲,很多个人站长会选择放弃使用Https。但是,自从开源、免费的Let’s Encrypt证书出现后,我觉得SSL也是我们草根站长可以玩的了。

如果你还在纠结要不要将自己的网站切换到Https,可以看看之前我的分析:我是如何将网站全站启用Https的?本文就来为大家梳理一下当前可供大家免费使用的SSL证书,关于SSL证书申请和安装方法部落之前都有介绍,大家可以直接点击进去查看详情。

作为站长,除了要保护网站数据传输安全,还要保护好域名、服务器等安全:

八大免费SSL证书-给你的网站免费添加Https安全加密

一、Let’s Encrypt

八大免费SSL证书-Let's Encrypt

1、Let’s Encrypt是国外一个公共的免费SSL项目,由 Linux 基金会托管,它的来头不小,由Mozilla、思科、Akamai、IdenTrust和EFF等组织发起,目的就是向网站自动签发和管理免费证书,以便加速互联网由HTTP过渡到HTTPS。

2、Let’s Encrypt安装部署简单、方便,目前CpanelOneinstack等面板都已经集成了Let’s Encrypt一键申请安装,网上也有不少的利用Let’s Encrypt开源的特性制作的在线免费SSL证书申请网站,总之Let’s Encrypt得到大家的认可。

二、StartSSL

八大免费SSL证书-StartSSL

1、StartSSL是StartCom公司旗下的SSL证书,应该算是免费SSL证书中的“鼻祖”,最早提供完全免费的SSL证书并且被各大浏览器所支持的恐怕就只有StartSSL证书了。任何个人都可以从StartSSL中申请到免费一年的SSL证书。

2、首次申请StartSSL免费SSL证书是免费一年,但是你可以在第二年继续续期。之前StartSSL管理SSL证书只有本地浏览器安装数字证书一种,所以一旦本地的数字证书丢失的话就无法获取到自己之前申请的证书了,不过现在已经增加了邮箱登录了。

3、如果你有看新闻,也许已经知道了“Mozilla正式提议将停止信任 WoSign 和 StartCom 签发的新证书”,对于StartSSL请观察事态发展后再谨慎使用。

三、COMODO PositiveSSL

八大免费SSL证书-COMODO PositiveSSL

1、COMODO官网只有免费90天的SSL证书试用申请,这个COMODO PositiveSSL证书来自UK2公司,VPS.net等就是UK2公司旗下的产品。目前获取UK2提供的免费COMODO PositiveSSL不需要额外的操作,只需要你将域名的IP地址解析到指定的IP即可。

2、先把域名解析到UK2公司的服务器上,然后在网页上获取SSL证书并下载,最后你就可以解除域名解析,同时将下载的域名证书文件上传到服务器配置SSL即可。不过由于是UK2提供的COMODO PositiveSSL免费证书,如果你没有用他们的主机总归不知道哪一天会出问题的。

四、CloudFlare SSL

八大免费SSL证书-CloudFlare SSL

1、CloudFlare提供的免费SSL证书是UniversalSSL,即通用SSL,用户无需向证书发放机构申请和配置证书就可以使用的SSL证书,CloudFlare向所有用户(包括免费用户)提供SSL加密功能。

2、不过Universal SSL的服务对免费用户有限制,CloudFlare只支持扩展支持Server Name Indication(SNI)协议的现代浏览器,这意味着它不支持IE6及之前版本、运行Android 2.2或更旧版本的Android浏览器。

五、Wosign沃通SSL

八大免费SSL证书-Wosign沃通SSL

1、Wosign沃通是国内一家提供SSL证书服务的网站,其免费的SSL证书申请比较简单,在线开通,一个SSL证书只能对应一个域名,支持证书状态在线查询协议(OCSP)。

2、由于Wosign沃通SSL是一家国内的SSL服务商,所以SSL证书申请和管理都比较简单,并且网站使用的是中文有问题还可以联系客服。不过,受“Mozilla正式提议将停止信任 WoSign 和 StartCom 签发的新证书”的影响,请观察后再决定是否使用。

六、腾讯云DV SSL 证书

八大免费SSL证书-腾讯云DV SSL 证书

1、腾讯云DV SSL 域名型证书由赛门铁克提供自动审核认证,快速签发,支持自动 CSR 生成、域名身份 DNS 自动验证,一步提交申请,审核签发流程全自动。可以一键部署到腾讯云资源,轻松获得数据安全。

七、loovit.net AlphaSSL

八大免费SSL证书-loovit.net AlphaSSL

1、loovit.net 是国外一个网站,背景不详,只是从今年四月份开始陆续有朋友告诉我这个网站提供了免费AlphaSSL证书申请,部落自己试了一下发现申请容易,但是成功率并不是100%。

八、360网站卫士、百度云加速免费SSL

360网站卫士、百度云加速免费SSL

1、360网站卫士、百度云加速与Symantec等合作推出了免费的SSL证书,其实类似于上面的腾讯云DV SSL 证书,只不过360网站卫士如果要使用SSL证书必须得实名认证而且还得使用他们家的CDN。而百度云加速则只能使用百度云服务器才可以申请免费SSL证书。

免费SSL证书小结

1、记得几年前使用SSL证书的网站仅限于一些电子商务类的网站,但是现在各大搜索引擎、各类行业网站都纷纷上马了Https,而SSL证书价格也是越来越低,免费的SSL证书也越来越多了,可供大家的选择也是越来越多了。

2、上面介绍的八大免费SSL证书,要说最让人放心的当属Let’s Encrypt了,效果也可以参考部落网站。其它七个免费SSL证书,建议大家谨慎使用,对于一些重要的网站还是建议你直接购买SSL证书:Namecheap SSL一年就十美元。

 

2014年六大免费VPS主机-免费VPS申请、使用和点评

Let’s Encrypt,免费好用的 HTTPS 证书

shenzt@sina.com阅读(199)

Let’s Encrypt,免费好用的 HTTPS 证书

很早之前我就在关注 Let’s Encrypt 这个免费、自动化、开放的证书签发服务。它由 ISRG(Internet Security Research Group,互联网安全研究小组)提供服务,而 ISRG 是来自于美国加利福尼亚州的一个公益组织。Let’s Encrypt 得到了 Mozilla、Cisco、Akamai、Electronic Frontier Foundation 和 Chrome 等众多公司和机构的支持,发展十分迅猛。

申请 Let’s Encrypt 证书不但免费,还非常简单,虽然每次只有 90 天的有效期,但可以通过脚本定期更新,配好之后一劳永逸。经过一段时间的观望,我也正式启用 Let’s Encrypt 证书了,本文记录本站申请过程和遇到的问题。

我没有使用 Let’s Encrypt 官网提供的工具来申请证书,而是用了 acme-tiny 这个更为小巧的开源工具。以下内容基本按照 acme-tiny 的说明文档写的,省略了一些我不需要的步骤。

ACME 全称是 Automated Certificate Management Environment,直译过来是自动化证书管理环境的意思,Let’s Encrypt 的证书签发过程使用的就是 ACME 协议。有关 ACME 协议的更多资料可以在这个仓库找到。

创建帐号

首先创建一个目录,例如 ssl,用来存放各种临时文件和最后的证书文件。进入这个目录,创建一个 RSA 私钥用于 Let’s Encrypt 识别你的身份:

openssl genrsa 4096 > account.key

创建 CSR 文件

接着就可以生成 CSR(Certificate Signing Request,证书签名请求)文件了。在这之前,还需要创建域名私钥(一定不要使用上面的账户私钥),根据证书不同类型,域名私钥也可以选择 RSA 和 ECC 两种不同类型。以下两种方式请根据实际情况二选一。

1)创建 RSA 私钥(兼容性好):

openssl genrsa 4096 > domain.key

2)创建 ECC 私钥(部分老旧操作系统、浏览器不支持。优点是证书体积小):

BASH#secp256r1
openssl ecparam -genkey -name secp256r1 | openssl ec -out domain.key

#secp384r1
openssl ecparam -genkey -name secp384r1 | openssl ec -out domain.key

有关 ECC 证书的更多介绍,请点击这里

有了私钥文件,就可以生成 CSR 文件了。在 CSR 中推荐至少把域名带 www 和不带 www 的两种情况都加进去,其它子域可以根据需要添加(目前一张证书最多可以包含 100 个域名):

openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:yoursite.com,DNS:www.yoursite.com")) > domain.csr

执行这一步时,如果提示找不到 /etc/ssl/openssl.cnf 文件,请看看 /usr/local/openssl/ssl/openssl.cnf是否存在。如果还是不行,也可以使用交互方式创建 CSR(需要注意 Common Name 必须为你的域名):

openssl req -new -sha256 -key domain.key -out domain.csr

配置验证服务

我们知道,CA 在签发 DV(Domain Validation)证书时,需要验证域名所有权。传统 CA 的验证方式一般是往 admin@yoursite.com 发验证邮件,而 Let’s Encrypt 是在你的服务器上生成一个随机验证文件,再通过创建 CSR 时指定的域名访问,如果可以访问则表明你对这个域名有控制权。

首先创建用于存放验证文件的目录,例如:

mkdir ~/www/challenges/

然后配置一个 HTTP 服务,以 Nginx 为例:

NGINXserver {
    server_name www.yoursite.com yoursite.com;

    location ^~ /.well-known/acme-challenge/ {
        alias /home/xxx/www/challenges/;
        try_files $uri =404;
    }

    location / {
        rewrite ^/(.*)$ https://yoursite.com/$1 permanent;
    }
}

以上配置优先查找 ~/www/challenges/ 目录下的文件,如果找不到就重定向到 HTTPS 地址。这个验证服务以后更新证书还要用到,建议一直保留。

获取网站证书

先把 acme-tiny 脚本保存到之前的 ssl 目录:

wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py

指定账户私钥、CSR 以及验证目录,执行脚本:

python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir ~/www/challenges/ > ./signed.crt

如果一切正常,当前目录下就会生成一个 signed.crt,这就是申请好的证书文件。

如果你把域名 DNS 解析放在国内,这一步很可能会遇到类似这样的错误:

ValueError: Wrote file to /home/xxx/www/challenges/oJbvpIhkwkBGBAQUklWJXyC8VbWAdQqlgpwUJkgC1Vg, but couldn't download http://www.yoursite.com/.well-known/acme-challenge/oJbvpIhkwkBGBAQUklWJXyC8VbWAdQqlgpwUJkgC1Vg

这是因为你的域名很可能在国外无法解析,可以找台国外 VPS 验证下。我的域名最近从 DNSPod 换到了阿里云解析,最后又换到了 CloudXNS,就是因为最近前两家在国外都很不稳定。如果你也遇到了类似情况,可以暂时使用国外的 DNS 解析服务商,例如 dns.he.net。如果还是搞不定,也可以试试「Neilpang/le」这个工具的 DNS Mode。

搞定网站证书后,还要下载 Let’s Encrypt 的中间证书。我在之前的文章中讲过,配置 HTTPS 证书时既不要漏掉中间证书,也不要包含根证书。在 Nginx 配置中,需要把中间证书和网站证书合在一起:

wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem

为了后续能顺利启用 OCSP Stapling,我们再把根证书和中间证书合在一起:

wget -O - https://letsencrypt.org/certs/isrgrootx1.pem > root.pem
cat intermediate.pem root.pem > full_chained.pem

最终,修改 Nginx 中有关证书的配置并 reload 服务即可:

ssl_certificate     ~/www/ssl/chained.pem;
ssl_certificate_key ~/www/ssl/domain.key;

Nginx 中与 HTTPS 有关的配置项很多,这里不一一列举了。如有需要,请参考本站配置

配置自动更新

Let’s Encrypt 签发的证书只有 90 天有效期,推荐使用脚本定期更新。例如我就创建了一个 renew_cert.sh 并通过 chmod a+x renew_cert.sh 赋予执行权限。文件内容如下:

BASH#!/bin/bash

cd /home/xxx/www/ssl/
python acme_tiny.py --account-key account.key --csr domain.csr --acme-dir /home/xxx/www/challenges/ > signed.crt || exit
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem
service nginx reload

crontab 中使用绝对路径比较保险,crontab -e 加入以下内容:

0 0 1 * * /home/xxx/shell/renew_cert.sh >/dev/null 2>&1

这样以后证书每个月都会自动更新,一劳永逸。实际上,Let’s Encrypt 官方将证书有效期定为 90 天一方面是为了更安全,更重要的是鼓励用户采用自动化部署方案。

几个问题

Let’s Encrypt 证书的兼容性,所有操作系统、浏览器默认是否都能识别是大家最关心的问题。实际上,由于 Let’s Encrypt 与 IdenTrust 的 DST Root CA 做了交叉认证,兼容性还是不错的,目前我只是发现在 Android 2 和 Windows XP 下有问题(Firefox 的证书那一套是自己实现的,不依赖于系统,XP 下只有 Firefox 信任 Let’s Encrypt 证书),其它环境都正常。

letsencrypt intermediate cert on winxp(Windows XP 不信任 Let’s Encrypt 的中间证书)

更新:根据 Let’s Encrypt 官方说明,Windows XP 下的问题很快就会解决:

A bug in Windows XP causes parsing of our current cross-signature from IdenTrust to fail. We will be correcting this by getting new cross-signatures from IdenTrust which work on Windows XP.
注:已于 2016 年 3 月 26 日解决。

另外一个问题有关 ECC 证书,官网表示计划将在 2016 年提供对 ECC 证书的支持:

Right now all of our root and intermediate keys use RSA. We’re planning to generate ECC keys and make an ECC option available to subscribers in 2016. via
注:Let’s Encrypt 已于 2016 年 2 月 11 日开始支持签发 ECC 证书。

Let’s Encrypt 官方的新特性预告可以在这个页面查看

我个人建议:对于个人用户来说,如果非常在意证书兼容性,可以购买 RapidSSL Standard 或者 Comodo Positive SSL 这两种证书。其中 RapidSSL 证书一共才三级,比较小;Comodo Positive 有四级,但可以申请 ECC 证书;二者都有着不错的兼容性,也非常廉价(一年不到 10$)。当然,如果不用考虑 Windows XP 用户,那么强烈推荐 Let’s Encrypt!

更新:Let’s Encrypt 已经支持 Windows XP 和签发 ECC 证书,对于个人用户来说,目前 Let’s Encrypt 无疑是最好的选择。

本文先写到这里,如果你在申请 Let’s Encrypt 证书的过程中遇到问题,可以给我留言,也欢迎交流各种心得!

 

客户端扫码设置教程

shenzt@sina.com阅读(331)

以安卓客户端APP为例,ios客户端与之相似。

一、下载安卓APP

安卓原版客户端下载  密码:d4ig

安卓增强版客户端下载 密码:b1vw

二、下载后安装打开APP

影梭客户端

三 开始扫码操作

影梭客户端

影梭客户端

四,打开网站后台,进入,我的订单,然后点击,管理

影梭客户端

五,点击选择新生成的配置文件点击之后,自动返回主界面,点击图标

影梭客户端

第一次使用,可能会出现下图,选择,我信任此应用,然后点击确定

影梭客户端

当图标    影梭客户端 变为    影梭客户端

表示连接成功,打开浏览器上网或者各种App即可科学上网

(如果提示后台无法调用vpn,那么重启一次手机即可)

无需root即可使用

浏览器和App都可以代理,和VPN效果完全一样

顶好爱迪 更专业 更方便

联系我们联系我们