590 likes | 691 Views
機械学習特論 第10回講義 最適化 手法1 遺伝的アルゴリズム. 知能工学専攻 串田 淳一. kushida@hiroshima-cu.ac.jp. 予定( 2019 年). 第 10 回 最適化手法 1 (6/10) 遺伝的アルゴリズム (Genetic A lgorithm, GA) 第 11 回 最適化手法 2 (7/1) 差分進化 (Differential Evolution, DE) 第 12 回 最適化 手法 3 (7/8) 粒子群 最適化 (Particle Swarm Optimization, PSO). 講義 資料 URL
E N D
機械学習特論 第10回講義最適化手法1遺伝的アルゴリズム機械学習特論 第10回講義最適化手法1遺伝的アルゴリズム 知能工学専攻 串田淳一 kushida@hiroshima-cu.ac.jp
予定(2019年) • 第10回 最適化手法1 (6/10) 遺伝的アルゴリズム(Genetic Algorithm, GA) • 第11回 最適化手法2 (7/1) 差分進化(Differential Evolution, DE) • 第12回 最適化手法3(7/8) 粒子群最適化(Particle Swarm Optimization, PSO) 講義資料URL http://www.ints.info.hiroshima-cu.ac.jp/~kushida/ML/index.htm
本日の内容 • 遺伝的アルゴリズムの概要 • 遺伝的アルゴリズムの処理手順 • 代表的なベンチマーク関数 • レポート課題,サンプルプログラムの説明
最適化手法 対象とする問題を数学的な問題としてモデル化(定式化) 定式化した問題を解くことで解を求める手法 最適化問題を解くためのアプローチ • 数理最適化(数理計画法) • メタヒューリスティクス • 単純なルールや発見的手法を反復的に用いる • (限られた時間内に,できる限り良質な)近似解を求めるアルゴリズム
メタヒューリスティクス手法 進化的アルゴリズム (Evolutionary Algorithm, EA) 進化的計算(Evolutionary Computation, EC) • 生物進化に基づくアプローチ • 遺伝的アルゴリズム(Genetic Algorithm, GA) • 差分進化(Differential Evolution, DE) • 群知能に基づくアプローチ • 粒子群最適化(Particle Swarm Optimization, PSO)
遺伝的アルゴリズムとは • Genetic Algorithm(GA): • 生物進化をモデル化した最適化アルゴリズム • (最適化:ある関数の最も小さい/大きい値になる変数を見つけること) • 問題の解 →「生物の個体」 • 形質遺伝,淘汰,突然変異などのメカニズムを模して解を探索 • 複数の個体を用いて探索 (Population based search) 解きたい問題の 解候補 個体集団 (Population)
進化論と進化的計算 地球には様々な生物が存在する. • 環境に適応した優秀な個体だけが子孫を残すことができる.(劣等な個体は淘汰される) • 優秀な個体の子孫が繁栄する. • 残った個体は突然変異を起こす場合があり,前の世代よりも優秀になることも、逆になることもある. これらを繰り返して,生物は進化してきた. 進化的計算 (GA) 「優秀な個体 = 良い解答」と見立て,進化的な演算を用いて 解を改善し,良い解を残していく
GAの歴史 • 1975年、John Hollandにより提案 • 文字列,ビット列{0,1}が対象(e.g. ナップサック問題) • その後様々な,拡張・改良が行われる • 設計変数が実数値である連続関数最適化問題にも対応 • GAの応用事例 • 製品のデザインの最適化 • 新幹線のフロントノーズの設計 • 飛行機の翼の形状 • タイヤのトレッドパターン • スケジューリング • 時間割・勤務表の最適化 • ジョブショップ・スケジューリング
ナップサック問題 荷物 1 荷物2 重さ: 4kg 価値: 150 重さ: 7kg 価値: 100 荷物4 20kgまで入る (制約条件) 荷物 3 重さ: 6kg 価値: 90 重さ: 10kg 価値: 160 合計の価値が最大になるような 品物の組み合わせを探す
GAによるナップサック問題の解法 0:入れない 1:入れる ナップサック問題の解 (ビット列で表現:コード化) 個体 適応度=価値の合計 - ペナルティ(超過量) 交叉 子1 親1 子2 親2 突然変異はビットを反転
実数値遺伝的アルゴリズム(Real-coded genetic algorithm) • 連続空間を探索領域とする • 探索する変数を(コード化せずに)実数値のまま扱う • 各個体は実数値のベクトルで表現 個体
最適化問題の定式化 minimize 目的関数 は決定変数ベクトル() subject to 不等式制約 等式制約 上下限制約 線形計画問題:が線形(一次式) 非線形計画問題:のいずれかが非線形
問題例 目的関数 不等式制約 等式制約 上下限制約
GAによる解探索 • 確率的な多点探索法 (進化は複数の個体が必要) • 探索空間内にランダムで探索点(個体)を発生させる • 個体の位置を更新しながら(進化させながら)解を探索 Sphere関数 Sphere関数における探索
GAが適用可能な問題 • 決定変数の上下限制約のみを有する最適化問題 • minimize 𝑓(𝒙) • subject to≤≤, 𝑖=,…,𝐷 • (,…,)は𝐷次元決定変数ベクトル • 𝑓(𝒙)は目的関数 (最適化する関数) • はそれぞれ,𝐷個の決定変数 の下限値,上限値 • 全ての上下限制約を満足する領域: 探索空間 Sphere function 探索する関数の性質が分からなくても (目的関数が不連続関数,微分不可能関数であっても) 探索点(個体)に対し,良さの評価値(関数値)を得ることができれば適用可能 () ?
解探索のイメージ • 関数の最小値(最大値)を探す=砂漠で最も石油が出る場所を探す • 一回掘るとその場所の埋蔵量(良さ)が分かる • たくさん掘れば大体の埋蔵量が把握できるが,その分コストが掛かる • なるべく少ない回数(コスト)で,最も埋蔵量が多い場所を見つけるには?
理想的な解探索 「大域的な探索」から「局所的な探索」へシフトするような探索 • 探索序盤は十分な多様性を保持し,網羅的に広い範囲を探索 • 探索終盤は集団を収束させ,優良な解周辺を集中的に探索 集団の分布 局所解への収束 (探索失敗) 局所解 局所解 多様性の保持と探索の集中化はトレードオフ →バランスを考慮した探索を実現することが課題 最適解
GAのアルゴリズム S0.初期化 個体(遺伝子)をランダムに生成し,初期集団を構成する. また,各個体を評価する.(適応度/適合度: fitness を計算する) S1.終了判定 終了条件を満足したら,終了する. (許容解を発見,最大世代数に達した,最大関数評価回数に達した,など) S2.親選択 子を生成する親を選択する S3.交叉と突然変異(遺伝演算) 交叉確率()に基づき,親個体(通常は2個体)から子個体を生成する. 突然変異確率()に基づき,子個体の遺伝子に突然変異を適用する. 子個体を評価する. S4.生存者選択 親個体と子個体から,次世代に残る個体を選択する. S5.S1.へ戻る
GAの擬似コード Initialize P(0) = { xi | i=1, 2, ... , N},Nは個体数(集団サイズ) EvaluateP(0) 個体の適合度(関数値)を求める for(t=1; 終了条件を満足しない; t++) { // tは世代数 for(i=1; i≦N; i++) { if(u(0,1) < ) 親個体を2個選択し,交叉により子個体xi’を生成 else 親個体を選択し,xi’ とする for(xi’の全ての遺伝子x’ij) if( u(0,1) < )x’ijを突然変異 } Evaluate C(t)={x’i | }子個体の集合C(t)を評価する P(t+1)=P(t)とC(t)から生存者を選択 } P(0)は最初の 個体集団 は0から1の範囲で予め決定 は0から1の範囲で予め決定 u(0,1)は区間[0,1]の一様乱数
GAの探索のイメージ 個体集団から遺伝演算によりを生成 とから次世代(世代)に残す個体を選択(不要な個体を削除) 選択された(生き残った)個体をとする(世代交代) 子 子 子 子 子
子個体生成の手順 遺伝子に変化を加える C(t) 子個体集団 交叉 P(t) 突然変異 x1’ x1’ x1’ x2’ x3’ x4’ 親個体の遺伝子を組み合せて 子を生成 x5’ 親個体を選択 x6’ 突然変異 x7’ x2’ x8’ x2’ x9’ 交叉をしない場合 (x2’=) P(t)(親個体の集団)と同じ数だけ子を生成
親個体の選択方法(parent selection) 良い子個体を生成するためには • なるべく「適応度の高い個体」を親とする • ただし,「ある程度多様な個体」を選ぶ必要がある (集団の多様性を維持するため) 両者をバランス良く選択する必要がある • ⇒GAの代表的な親個体の選択方法 • ルーレット選択 • ランキング選択 • トーナメント選択
ルーレット選択 • 親として選択される確率を個体の適応度に比例させる. • 個体の適応度をとすると,選択確率は (適応度は非負でなければならない) • 非常に適応度の高い個体が出現すると,急速に多様性が失われることがある. :個体数 個体5 個体1 *最大化問題とする →関数値が大きいほど親として 選ばれやすい 個体4 個体2 個体3
ランキング選択 • 個体のランクを適応度の良い順に1, 2, … , とし,ランクによって選択確率を決定する. • 個体のランクをとした場合,選択確率は ,, • はパラメータ(ユーザが決定) • ランク1の個体は,ランクの個体は,メジアンの個体はの確率で選択される の場合の選択確率 *最大化問題とする
トーナメント選択 • ランダムに選択したトーナメントサイズ()個の個体から最良の個体を選択する. • はパラメータ(ユーザが決定) • を大きくすると良い個体が選ばれやすくなり,探索速度が増加する(選択圧が強くなる).一方,集団の多様性が失われて局所解に陥りやすくなる. 個の親候補 P(t) 最良の個体 (関数値が最も良い個体) を親として選択する ランダム で選択
交叉(Crossover) 選択された親個体の形質を受け継いだ子個体を生成する ⇨「親個体群の分布」と似た分布となるような子個体を生成 実数値GAにおける代表的な交叉方法 • ブレンド交叉(BLX-) • シンプレックス交叉(SPX) • 単峰性正規分布交叉(UNDX) 親2 親3 正規分布 親1 SPX交叉の例 UNDX交叉の例
ブレンド交叉(BLX-) • 子の次元の遺伝子は2つの親(,)の遺伝子を含む拡張領域から乱数を用いて選択 はの一様乱数(次元ごとに決定) あるいは(理論値) 両親によって決まる,各辺が座標軸に平行な超直方体の領域において ランダムサーチを行う 1 子 親1 子 1 子 子 親2 子
突然変異(mutation) 子の遺伝子の値を変異させる 方法:ある分布に従う乱数を発生 • Gauss分布 平均値標準偏差の正規分布の確率密度関数 • Cauchy分布 の確率密度関数 は位置(location) は尺度(scale) 標準正規分布 標準コーシー分布
突然変異の種類 子の次元目の遺伝子の突然変異 ・Gauss突然変異 ・Cauchy突然変異 ・一様突然変異 は範囲[0,1]の一様乱数,はステップサイズ(変異の幅) 𝐶はコーシー乱数 突然変異の対象となる遺伝子は確率で選ばれる 各遺伝子が変異する確率 が妥当 (平均1遺伝子が変異)
生成される子個体の位置 突然変異 親1 交叉で生成された子 次元 1 2 3 4 5 6 7 8 9 10 親2 上下限を超えた解が生成された場合 ⇒修正し,制約内へ
上下限制約を満たす方法:鏡像反射 新たに生成した個体 修正した個体 次元ごとに(上限/下限から) はみ出した分を反射する は
〇生存者選択1(survivor selection) ・離散世代モデル 生成したC(t)を,そのまま次世代個体として選択 P(t) C(t) P(t+1) x1’ x2’ x3’ x4’ x5’ x6’ x7’ x8’ x9’
〇生存者選択2(survivor selection) ・連続世代モデル P(t)とC(t)を合わせて,関数値順にソート 上位個を次世代個体として選択 x1’ x1’ P(t) C(t) P(t+1) x2’ x3’ x5’ x4’ x3’ x5’ x6’ x9’ x7’ x8’ x4’ x9’ x7’
〇生存者選択3(survivor selection) ・エリート選択 前世代の最良個体を必ず生存者として選択 (離散世代モデルと併用) P(t) C(t) P(t+1) x1’ x2’ x3’ 最良個体 x4’ x5’ x6’ x7’ x8’ x9’
GAの各オペレータの役割 突然変異 親個体の分布とは異なる (交叉では生成されない)領域を探索 交叉 親個体の分布と似たような (特徴を引き継ぐ)分布を生成 親個体集団 子個体集団 局所解 局所解 最適解 生存選択 良好な個体を次世代に残す (ただし多様性を保つために,適応度が悪い個体も選択する必要がある)
目的関数の特徴 • 関数の形状:単峰性/多峰性 単峰性 多峰性 • 変数間依存性 • 目的関数を各変数ごとの関数の和として分離して表現できるか/できないか • ) • ) • 悪スケール性 • 各変数のスケールが大きく異なるか/同等か
代表的なベンチマーク関数 Sphere function 単峰性のシンプルな関数,変数間依存性なし 各次元毎に最小値を探せる! Minimum is
Sum of different powerfunction 悪スケール性を持つ ⇨関数の傾斜が次元ごとに異なる Minimum is
Rastriginfunction Minimum is 多峰性関数,変数間依存性なし 格子状(座標軸に並行)に局所解が存在
Rosenbrockfunction Star型 Chain型 Minimum is • 変数解間依存性あり (変数同士の積の項がある) • 座標軸に平行でない長い谷があり,最適解は谷の中に位置する • 変数間依存性はStarの方が強い
Schafferfunction Minimum is 多峰性,変数解間依存性あり
Schwefel function Minimum is 多峰性,変数間依存性なし 最適解は定義域)の端
Griewank function Minimum is 巨視的に見ると単峰性 微視的に見ると多峰性 多峰性,変数解間依存性あり
遺伝的アルゴリズム レポート課題 サンプルプログラムを参考にして,関数の最適化を行い, 下記の項目についてレポートせよ. • プログラムの変更点/工夫した点 • パラメータ調整の様子 • プログラムの変更の試行錯誤 • 試行錯誤した上での最良の結果 などについてもレポートに含めて下さい. 最適化対象の関数: • Sphere関数(30次元) (全員) • Schaffer 関数(30次元)学籍番号が偶数 • Griewank関数(30次元)学籍番号が奇数 締め切り 6/14(金) 串田居室(情643)のメールボックスに提出
サンプルプログラムでのGAの実装 • パラメータ設定 • 個体数,交叉率,突然変異率 • 親個体の選択の仕方 • トーナメント選択(パラメータ) • 交叉方法 • BLX- (パラメータ) • 突然変異 • ガウス突然変異(パラメータ) • コーシー突然変異(パラメータ) • 一様突然変異(パラメータ) • 生存者選択 • 離散世代モデル,連続世代モデル
プログラム中の変更可能なパラメータ • 個体数(Nindividuals) • トーナメントサイズ(TournamentSize) • 交叉率(Pc): 個体が交叉を行う確率 • BLX-αのパラメータ(Alpha) • 突然変異率(Pm): 遺伝子に突然変異を行う確率 • ガウス(or コーシー)突然変異の分散の初期値(Delta_0) • ガウス(or コーシー)突然変異の分散の最終値(Delta_T) 初期値Delta_0とDelta_Tで制御 δ delta-=(Delta_0-Delta_T)/T_MAX; Delta_0 Delta_T 世代 0 T_MAX
パラメータ設定 #define RUN_MAX 30// 試行回数(平均性能を調べるため) #define MAX_EVALUATIONS 200000//最大関数評価回数 #define Nindividuals 50// 個体数 #define T_MAX (MAX_EVALUATIONS/Nindividuals) // 最大世代数(繰り返し回数) 固定 使用できる計算コストはMAX_EVALUATIONSで決定する => 何回,個体の適応度(関数値)を計算したか? Nindividuals Nindividuals MAX_EVALUATIONS 同じ 評価回数 T_MAX MAX_EVALUATIONS T_MAX T_MAXは設定した個体数により自動的に決まる
個体の構造体 /* 個体の構造体 */ typedefstruct { double *x; /* genes */ double f; /* fitness value */ } IndividualRec, *Individual; … #define Nvariables 30 // 決定変数ベクトルの次元 固定
初期化領域 • #define LOWER -100.0 // 下限 • #define UPPER 100.0 // 上限 固定 関数Initializeで上下限内に初期個体を生成 for(i=0; i<n; i++) { for(j=0; j<Nvariables; j++) P[i].x[j]=LOWER+(UPPER-LOWER)*Rand(); // 上下限制約内にランダムに生成 EvaluateIndividual(&P[i]); // 個体の評価 if(better(P[i].f, P[best].f)) best=i; } *探索中は上下限の制約なし
main関数 int main(void) { intrun; Individual Pop, New, Best; double min, max; Pop=NewIndividuals(Nindividuals*2); New=&Pop[Nindividuals]; Best=NewIndividuals(1); double sum=0, ssum=0; for(run=0; run<RUN_MAX; run++) { srand((run+1)*123456789); // 乱数シードの設定 SGA(Pop, New, Best); printf("%2d: ", run+1); Print(Best); } … P(t) POP n個体を動的に割り当てる関数 C(t) NEW Best 世代を通しての 最良個体 … …