最適化問題とは、任意の関数の出力値が最大、もしくは最小となる引数は何か、という問題です。任意の関数が単純な形、例えば次の図の様なきれいな谷の場合は解を陽に求める(試行することなく一発で求められる)ことが出来ます。
しかし現実の問題はもっと複雑です。引数は多く、関数の出力は多峰性を持ちます。
それでもとりあえず関数と引数さえ用意できれば(深く取り組むなら関数を考えること、関数を作ることに相当労力がかかります)、関数の出力を評価することはできます。
今日まで考えられてきた機械学習手法はより正確な関数を用意し、より早くに正確に最大、最小となるパラメータを見つけるためのものです。この記事で考えるのは、より早くに正確に最大、最小となるパラメータを見つける、という部分を無視し、単純な乱数で最大、最小に近づく方法です。
# 最小問題について def main(): params = Params() # 引数オブジェクト。より適した値らが入る for i in range(0, 1000): # 雑に回す p_key, p_value = get_rand_param() # なにか値を引っ張ってくる。ここの動きを正確にすると機械学習になる new_val, new_params = get_eval(params, p_key, p_value) # 関数に引数を入力。この関数を正確にすると機械学習になる params = new_params if new_val < val else params # 評価値が前回の結果より良いならば引数更新
具体的な関数の中身は書いていませんがこれを拡張すると機械学習らしいことができます。最終的に最も良いものを選んでいますが、このままだと引数がランダムなので学習感ないですね。