在运行目录下创建ca文件夹
#mkdir ca
#cd ca
将openssl.cfg拷贝到运行目录下
#cp /vendor/openssl/openssl-1.0.0/apps/openssl.cfg .
修改openssl.cfg,修改CA_default默认路径dir为./ca,修改certificate为$dir/ca_cert.pem,修改private_key为$dir/ca_key.pem
[ CA_default ]
dir = ./ca # Where everything is kept
certificate = $dir/ca_cert.pem # The CA certificate
private_key = $dir/ca_key.pem# The private key
新建./ca/index.txt空文件
新建./ca/serial文件,设置其内容为014A
在./ca下创建newcerts目录存放新证书
#mkdir newcerts
2)签发ca证书
#openssl req -x509 -newkey rsa:1024 -keyout ca/ca_key.pem -out ca_cert.pem -outform PEM -config openssl.cnf
产生一个1024位的RSA私钥“ca_key.pem”,并用他自签发出来一个证书“ca_cert.pem”。这个证书将来用来当作CA根证书。
会要求用户填入相应的信息,首先是ca_key.pem的加密口令,接下来是CA根证书的相应信息。
3)签发测试证书
openssl req -newkey rsa:1024 -keyout ca/testkey.pem -keyform PEM -out ca/testreq.pem -outform PEM -config openssl.cnf
openssl ca -in ca/testreq.pem -out ca/testres.pem -config openssl.cnf
4)使用测试证书加/解密
加密
openssl rsautl -encrypt -in ca/test.txt -inkey ca/testres.pem -certin -out ca/test.en -config openssl.cnf
解密
openssl rsautl -decrypt -in ca/test.en -inkey ca/testkey.pem -out ca/test.de -config openssl.cnf
FAQ
1)调用PEM_read_bio_PrivateKey等函数失败
请检查是否调用了OpenSSL_add_all_algorithms();对openssl进行了初始化
在过去的二十年里,科技飞速发展,从最初的因特网只有3个网站(微软,网景和亚马逊),到1999年的8亿网页,再到今天的500亿网页, 因特网经历了一个指数级的增长。即便是在因特网上休闲冲浪,也足以让你相信网上有无数的信息和链接。然而,这些信息都是无用的,除非我们对其搜索和排名。从1990年的第一个搜索引擎Archie到我们今天使用的现代搜索引擎,如何决定网上信息的想关性一直是一个很重要的问题。
以下是我们对最著名的搜索引擎之一Google背后的数学知识的分析,前两节的内容是独立的,然后的两节需要用到前面的知识。
A snapshot of the Internet graph. Image provided by Wikipedia.
多层神经网络寻求的是一种在训练线性判别函数的同时学习其非线性程度的方法;决定非线性映射的参数的学习是与控制线性判别函数的参数的学习同时进行的。
两层网络只能实现一个线性判决边界,如果给出足够数量的隐单元,三层及更多层网络就可以实现任意的判决边界。各判决区不必是凸的或是单联通的。
多层神经网络的优点是算法简单,运行非线性函数的具体形式可以通过训练样本获得。
训练多层网络的方法即反向传播算法(BP算法),是基于误差的梯度下降准则(LMS算法)的一种自然延伸。
神经网络是一种可以适应复杂模型的非常灵活的启发式的统计模式识别技术。
反向传播有一些启发式技巧,我们可以对输入值的范围、初始权值、期望输出等参数值做出明智的选择。
网络拓扑在神经网络分类中起着重要作用。通过对隐含层的数目、节点单元个数、反馈节点的个数等选择,可将对问题非正式或启发式的知识嵌入到网络结构中。因此,网络拓扑的设置也是一种启发式的选择。
设置网络拓扑来选择模型、通过反向传播算法来估计参数,是测试各种可选模型的方法。
神经网络技术应用问题涉及到正则化,即选择或调整网络的复杂程度。
1 前馈运算和分类
如图的三层神经网络由一个输入层、一个隐含层、一个输出层组成。它们由修正的权值互连。除了连接输入单元,每个单元还连接着一个偏置(bias)。在模式识别里,输入单元提供特征量,输出单元激发的信号成为用来分类的判别函数的值。
隐含单元对各个输入进行加权求和运算的“净激活”:
每个隐含层单元激发出一个输出分量,这个分量是它激活的非线性函数,即
输出单元的净激活:
输出单元对net的非线性函数是:
例如,激活函数可以是符号函数,但一般要求激活函数式连续可微的。也允许输出层的激活函数同隐含层的不一样,甚至每个单元都有不同的激活函数。
只有两种类别时,一般只采用单个输出单元,通过输出值得符号来标识一个输入模式。有多个输出单元时,计算每个判别函数,并通过使判别函数最大来将输入信号分类。
多层网络的表达能力:任何从输入到输出的连续映射函数都可以用一个三层非线性网络实现,条件是给出足够数量的隐单元nH、适当的非线性函数和权值。
2 反向传播算法
神经网络的关键问题是根据训练样本和期望输出来设置合适的权值。
反向传播是最简单也最一般的方法,是线性LMS算法的自然延伸,更具启发价值。
反向传播的作用在于可以对每一个隐单元计算有效误差,并由此推导出一个输入层到隐含层权值的学习规则。
网络由两类基本运算模式:前馈和学习。前馈运算包括提供一个模式给输入单元、在网络间传递信号,然后在输入单元得到输出。对于有监督的学习,包括了提供一个输入模式,并改变网络参数使实际输出更加接近期望教师信号或目标值。
上图的三层网络中:在前馈操作里,一个d维的输入模式x被提供给输入层,每个输入单元发送它所对应的分量xi。nH个隐单元中的每一个都计算它的净激活能netj,它是输入层信号和隐单元权值wji的内积。隐单元的输出是yj=f(netj),f()是一个非线性转换函数,这里是sigmoid。c个输出单元的工作原理类似于隐含层单元的,计算净激活能netk,即隐单元信号和输出单元权值的内积。网络的最终发送信号zk=f(netk)作为分类用的判别函数。网络训练过程中,这些输出信号和一个引导向量或目标向量t作比较,任何差值都用于整个网络的权值训练。
任一差值对应一误差。该误差或准则函数是权值的某种标量函数,它在网络输出与期望输出匹配时达到最小。权值向着可以减小误差值的方向调整。
考虑一个模式的训练误差,定义为输出端的期望输出值tk和实际输出值zk的差的平方和。即损失函数:
方向传播学习规则是基于梯度下降法的。权值首先被初始化为随机值,然后向误差减小的方向调整。
其中n是学习率,仅表示权值的相对变化尺度。
迭代算法在第m次迭代时取一个权向量并将它更新为
考虑第一个隐含层到输出层的权值wkj。由于误差并不是明显决定于wjk,我们必须使用链式微分法则:
其中单元k的敏感度定义为
此敏感度描述总误差怎样随着单元的激发而变化。
由输出单元净激活公式可推得:
综上所述,可得隐含层到输出层的权值更新或学习规则:
考虑输入层到隐含层的权值学习规则
反向传播算法,更确切的说“误差反向传播”算法。在训练过程中一个误差(敏感度)必须从输出层传播回隐含层,以实现输入层到隐含层的权值学习。本质上,反向传播只是“分层模型”里的梯度下降法。在分层模型里对连续函数执行链式法则可以计算准则函数对所有模型权值的导数。
初始权值的设置
如果权值全部为0,反向传播误差也将为0,输入层到输出层的权值将不变。故不能设为0,一般采用随机初始值。
3 训练协议及学习曲线
三种:随机训练、成批训练、在线训练
随机训练是指模式是随机从训练集中取出的,网络权值也根据不同模式进行更新。
成批训练是指在每回合训练时将全部模式送入网络中训练,直到总的误差小于预设值为止。
在线训练是指每种模式只提供一次,不需要存储器来保存模式。
训练误差开始时很高,随着学习的进展,误差越来越小。训练误差的渐近值由贝叶斯误差、训练数据的数量、网络的表达能力(如权值的个数)共同决定。
使用验证集,在验证集上的误差取得极小值时停止训练。
参考资料
《模式分类》Richard O.Duda