Python⾃然语⾔处理系列之模拟退⽕算法
1、基本概念
模拟退⽕算法(Simulated Annealing,SA)是⼀种模拟固体降温过程的最优化算法。其模拟的过程是⾸先将固体加温⾄某⼀温度,固体内部的粒⼦随温度上升慢慢变为⽆序的状态,内能增⼤,然后让其慢慢冷却,温度下降时,内部的粒⼦慢慢趋于有序,达到⼀种平衡态,最后达到常温时成为基态,此时内能减为最⼩,算法模拟这样⼀个过程期望能达到最优化的⽬的。
模拟退⽕算法最早是由kirkpatrick等⼈应⽤于组合优化领域,它是基于Monte-Carlo迭代求解策略的⼀种随机寻优算法。算法从某⼀较⾼温度开始,不断下降温度参数,结合概率跳变性在解空间中随机的寻⽬标函数的全局最优解,算法的关键点是其能在降温过程中达到局部最优解的情况下以⼀定的概率跳出局部最优解并最终趋于全局最优。模拟退⽕算法是⼀种通⽤的优化算法,理论上以概率1收敛于全局最优,在⼯程中有⽐较⼴泛的应⽤,如VLSI、⽣成调度、控制⼯程、机器学习、神经⽹络、信号处理等领域。
2、算法原理
模拟退⽕算法分为三部分:初始解、解空间以及⽬标函数,分别对应物理退⽕过程中的初始温度、降温以及最终温度。
1)初始解:初始解释算法迭代的起点,试验表明,模拟退⽕算法是健壮的,即最终解的求得最优解并不⼗分依赖初始解的选取,从⽽可任意选择⼀个初始解。当然,如果初始解选择得当可以加快到全局最优解。
2)解空间:⼀般是离散的可⾏解的集合。
3)⽬标函数:对优化⽬标的量化描述,是解空间到某个数集的⼀个映射,通常表⽰为若⼲优化⽬标的⼀个和式,应正确体现问题的整体优化要求且较易计算,当解空间包含不可⾏解时还应包括罚函数。
算法从初始解或称为初始状态开始,在解空间中进⾏启发式搜索(通常是随机搜索的⽅式),最终搜索到最优的⽬标值。
算法的基本过程如下:
1. 初始化:设定初始温度T,初始解状态S,终⽌温度T0;
2. 降温过程:如果T>T0,则循环执⾏3⾄6步;
3. 在解空间中随机搜索⼀个新解S’;
4. 计算增量ΔE=E(S′)-E(S),其中C(S)为解S对应的⽬标函数值或称为评价函数;
5. 若ΔE<0则接受S′作为新的当前解,否则以概率exp(-ΔE/T)接受S′作为新的当前解;
6. 如果满⾜终⽌条件则输出当前解作为最优解,结束程序。终⽌条件有两种情况,⼀是温度已经达到了最低温度T0;⼆是在连续的取若
⼲个新解都没有跳出当前最优解
算法流程图如下:
3、退⽕⽅式
模拟退⽕算法中,退⽕⽅式对算法有很⼤影响。如果温度下降过慢,算法的收敛速度会⼤⼤降低。如果温度下降过快,可能会丢失极值点。为了提⾼模拟退⽕算法的性能,许多学者提出了退⽕的各种⽅式,⽐较有代表性的有以下⼏种:
1)
该⽅式的特点是温度下降缓慢,算法收敛速度也较慢,但是最终达到全局最优的可能性是最⾼的
2)
式中a为可调参数,可以改善退⽕曲线的形态。其特点是⾼温区温度下降⽐较快,低温区下降⽐较慢,这种退⽕⽅式主要期望在低温区收敛到全局最优。
3)
式中a为可调参数,其特点是温度下降很快,算法的收敛速度快,但是带来的损失是可能不能充分的收敛到全局最优
while语句怎么用自然语言以上三种退⽕⽅式各有优缺点以及适⽤的场景,需针对具体的应⽤进⾏选择。
4、模拟退⽕算法在英⽂分词中的应⽤
(1)问题描述
英⽂通常不需要分词,因为其本⾝就是由⼀个个的英⽂单词组成,我们考虑⼀种场景,⽐如在⼝语语⾔处理中,听者必须将连续的语⾳流分割成单个的词汇,考虑由机器进⾏分词,这个问题就变得具有挑战性了,考虑下⾯⼈为构造的例⼦,单词边界已被⼈为去除:
a:doyouseethekitty
b:seethedoggy
c:doyoulikethekitty
d:likethedoggy
如果是由机器来识别单词边界,则需要到⼀种算法来对每个句⼦进⾏分词。我们可以给每个字符标注⼀个布尔值来指⽰这个字符后⾯是否有⼀个分词标志,让我们假设说话⼈会给语⾔学习者(机器)⼀个说话时的停顿,这往往是对应⼀个延长的暂停,分别对应了abcd四个句⼦块。现在算法的任务就是对这个句⼦块进⾏分词,使得每个句⼦都能有对应的意思。
经过处理后,四个句⼦变为如下的形式:
text = "doyouseethekittyseethedoggydoyoulikethekittylikethedoggy"
seg1= "0000000000000001000000000010000000000000000100000000000"
seg2= "0100100100100001001001000010100100010010000100010010000"
其中seg1是初始解,seg2是全局最优的⽬标解,算法采⽤模拟退⽕算法通过若⼲轮迭代达到全局最优。
(2)模拟退⽕算法引⼊
初始解:初始解即为上⾯提到的seg1串。
解空间:解空间是离散的,分别对应的是串中每位为1的情况,每个块(a、b、c、d)都有2的n次幂的分词⽅法,n为块的长度。
⽬标函数:⽬标函数是⼀个打分函数,该打分函数能够体现分词的⼀个效果,也就是说分词效果越接近全局最优,分数应越低或越⾼。
模拟退⽕算法⾃⾝需要考虑三个与温度相关的量:
初始温度:初始温度可设为⼀个⽐较⾼的温度,使得算法有⾜够的时间收敛到全局最优
降温⽅式:降温⽅式采⽤线性⽅式,T’=a*T,a是⼀个⼩于1的参数,可设为0.99,充分降温,使得搜索解空间更加充分。
终⽌温度:终⽌温度与初始温度对应,当初始温度降到终⽌温度时,算法终⽌,因此终⽌温度的选择也与算法达到全局最优解密切相关
(3)算法设计
搜索解空间
搜索解空间就是是寻最⼤化⽬标函数值的0和1的模式,最好的分词包括像“thekitty”这样的“词”,因为数据中没有⾜够的证据进⼀步分割这个词。使⽤模拟退⽕算法的⾮确定性搜索即随机搜索:⼀开始仅搜索短语分词;随机扰动0和1,它们与“温度”成⽐例;每次迭代温度都会降低,扰动边界会减少
⽬标函数或代价函数
⽬标函数是⼀个打分函数,我们将基于词典的⼤⼩和从词典中重构源⽂本所需的信息量尽⼒优化它的值。
给定⼀个假设的源⽂本的分词(左),推导出⼀个词典和推导表,它能让源⽂本重构,然后合计每个词项(包括边界标志)与推导表的字符数,作为分词质量的得分;得分值越⼩表明分词越好。
如上图⽰的⼀种分词情况,⽬标得分包括两个部分,⼀个分词得分LEXICON,⼀个是分块得分DERIVATION。LEXICON对分好的每个唯⼀的词进⾏算分,分数即为单词长度加上边界1,如doyou的分词得分为单词长度5加上边界1即为6,其他词计算⽅法类似;分块得分就是买个块包含的单词数量,如第⼀个1|2|4|6,其得分为4,依次类推,最终得到分词得分为33,分块得分为14,两者相加即为总得⽬标得分,该⽬标得分越⼩则分词效果就越好,也就越接近我们⼈⼯识别的⽬标。
(3)算法伪代码
@text:待分词⽂本
@segs:初始解,为01串
@iterations:每个温度的迭代次数,⽬的是在在每次降温时都能到⼀个当前最优的解,
这个量是当⽬标达到⼀个局部最优时,能够使得算法有⼀定的概率跳出当前局部最优解,是模拟退⽕算法中以⼀定概率接受较差解的⼀种实现⽅式,随着温度的降低,这种概率会减⼩,具体实现是flip_n函数,其跳变的位数与温度正相关。
@a:退⽕因⼦
string anneal(text, segs, iterations, a)
T=float(length(segs));
while T > T0
score=evaluate(text, segs)
best_segs=segs
for i=1 to iterations
//flip_n是随机选择n位位进⾏跳变,这⾥n为int(round(T)),其与当前温//度相关,温度下降时,跳变的位数会减⼩,具体实现原理是保证温度下//降时,解跳变的概率会减⼩,最后返回跳变后的串
guess = flip_n(segs, int(round(T)))
//evalue即是我们上⾯讨论的⽬标函数或代价函数
score = evalue(text, guess)
if score < best
best = score
best_segs=guess
score = best
segs = best_segs
T = T*a//降温
//打印每⼀步的优化结果
print evalue(text, segs), segment(text, segs)
经过程序实际运⾏,打印过程为,最左边⼀列是其对应分数
60 ['doyouseetheki', 'tty', 'see', 'thedoggy', 'doyouliketh', 'ekittylike', 'thedoggy']
58 ['doy', 'ouseetheki', 'ttysee', 'thedoggy', 'doy', 'o', 'ulikethekittylike', 'thedoggy']
56 ['doyou', 'seetheki', 'ttysee', 'thedoggy', 'doyou', 'liketh', 'ekittylike', 'thedoggy']
54 ['doyou', 'seethekit', 'tysee', 'thedoggy', 'doyou', 'likethekittylike', 'thedoggy']
53 ['doyou', 'seethekit', 'tysee', 'thedoggy', 'doyou', 'like', 'thekitty', 'like', 'thedoggy'] 51 ['doyou', 'seethekittysee', 'thedoggy', 'doyou', 'like', 'thekitty', 'like', 'thedoggy']
42 ['doyou', 'see', 'thekitty', 'see', 'thedoggy', 'doyou', 'like', 'thekitty', 'like', 'thedoggy'] 42分是最优结果,对应全局最优的01串是:
'0000100100000001001000000010000100010000000100010000000'
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论