この記事はSSSRC Advent Calender 2022 11日目として書かれています。
こんにちは。卒論に追われているB4の林です。
今回は酒飲みの酒飲みによる酒飲みのための記事です。
12月も1/3が終わりました。そろそろクリスマスですね。
クリスマスにぴったりなお酒を作ろうと考えたところ、こちらのサイトが見つかりました。
ホットブランデーモカ美味しそう…!と思いいざ作ろうとしました。
ブランデー20ml, カルーア15mlにココア適量を混ぜる。
…適量!?
定量的に示してもらわないと。適当に作っていては美味しいお酒は作れません。
ということで今回は理系らしくベイズ最適化を使って一番美味しいブランデーモカができる配合を考えてみました。
ベイズ最適化とは
ベイズ最適化は機械学習で用いられるパラメータチューニング法で、中身のわからないブラックボックス関数f(x) の最大値や最小値を求めることができます。詳しい説明はこちらをご覧ください。
今回はブランデーの量、カルーアの量、生クリームの量を入力パラメータ、出力値を味の採点結果とします。(出力値は完全に主観ですがそこは目を瞑ってください)
整理すると
(味の点数) = f( ブランデー , カルーア , 生クリーム) という形状のわからない関数を考え、この点数が大きくなる(味が美味しくなる)ような入力パラメータの値をベイズ最適化で求めようというのが今回の実験の目的です。
それでは早速作っていきましょ〜
準備物
・ブランデー
・カルーアミルク
・牛乳
・ココアパウダー(無糖)
・砂糖
・生クリーム
そして今回は採点者としてお酒大好きM氏、N氏、S氏に協力してもらいました。
実験方法
- 牛乳120mlに対してココアパウダー10g, 砂糖6gを加えて混ぜ、ココアを作る
- 初期値として以下の表に示した配合でブランデーモカを3通り作り、4人で味見して採点する。また、4人の採点の平均値を計算する。
|
brandy [ml] |
Kahlua [ml] |
cream[ml] |
Milk[ml] |
1 |
20 |
20 |
0 |
10 |
2 |
20 |
10 |
20 |
20 |
3 |
5 |
5 |
5 |
40 |
3. 配合量と採点結果をCSVファイルに入力し、ベイズ最適化プログラムを実行する
4. ベイズ最適化プログラムが提案してくれた配合でブランデーモカを作り、味見して採点する
5. 採点結果が90点となるまで3,4 を繰り返す
6. 採点結果が90点以上になったら最適化を終了する
実験
結果
まず、牛乳とココアパウダーと砂糖を混ぜ、レンジでチンしました。
すると、、、
溢れてしまいました。 早速失敗、、、先行き不安ですね〜(フラグ)
続いて適当な配合でベイズ最適化に与える初期値となるブランデーモカを作りました。あったか〜いブランデーモカを作りたいけれどこれ以上レンジの中を荒らすことはできないので、湯煎することにしました。
なんだかんだでやっと初期値となるブランデーモカが完成。それがこちら。
(不味そうとか言わないの!!)
これらを4人で分けて飲んで採点しました。採点結果は左から48点、62点、37点です。…どれもそんなに美味しくないです。
一番左はブランデーがきつすぎました…
続いてこれらの採点結果ををCSVファイルに記入します。
1行目にはラベル、2行目には探索の変動幅、3行目には探索の最小値、4行目には探索の最大値を書いています。今回はどの材料も5mlずつ変化させて探索を行うようにしました。
初期値の結果は5行目以降に書いています。各行の最後の数字が味の点数です。
そしてプログラムを実行。するとベイズ最適化プログラムが次の配合量を提案してくれます。
次はこの配合でブランデーモカを作ります。
以上の流れを繰り返し行い、点数が90点以上になったら終了です。
配合して飲んでは採点、配合して飲んでは採点…
14回飲んだ結果がこちら。
5~7行目が初期値で、それ以降が実験結果です。5行目以降の各行一番最後の数字が味の点数です。
…全然点数が上がらない(むしろ下がってる)
何度も不味いブランデーモカを飲んだので、ここで一度休憩してプログラムを見直してみました。すると重大な事実が発覚。
79行目、ベイズ最適化の設定がLCBとなっています。
ベイズ最適化は先ほども述べたように、関数の最大値や最小値を求めることができます。LCBは Lower Confidence Boundの略で, 関数の最小値を求めたい時に使います。
…すなわち、このプログラムの設定は最高に不味いブランデーモカを作るようになっていたわけです。
最大値を求めたいならこの部分を”UCB” (Upper Confidence Bound) とする必要がありますね〜
実験に失敗はつきもの。ここでだいぶ酔ってきた皆さんの感想をどうぞ。
S氏 「飲みすぎて舌がバカになっていく」
M氏 「日本酒飲みてぇ」
N氏 「帰ろうかな」
…帰らせません。再実験です。まだまだ飲んでもらわないと。
都合により、プログラムを変更するのではなく点数の付け方を変更しました。
スコア =(100 - 4人の点数の平均点)
とし、スコアが10点以下(4人の平均点が90点以上)となれば最適化を終了することにします。
またブランデーの量が多すぎると飲むのが大変なので(結構酔ってしまったので)、ブランデーの最大値を20mlとしました。
与えた初期値はこちらです。
brandy[ml] |
Kahlua[ml] |
cream[ml] |
score[点] |
20 |
20 |
0 |
52 |
5 |
30 |
5 |
27 |
10 |
30 |
5 |
42 |
そして出た結果がこちら。5~7行目に初期値、それ以降に実験値が書かれています。
初期値を入れなければ8回目で採点結果が91点となり、スコアが9点になったので最適化が終了しました!!
ブランデー5ml、カルーア25ml、ココア20ml、クリーム20mlの配合が一番美味しいという結論になりました。これは満場一致で美味しい
探索の組み合わせは全部で4 × 6 × 5 = 120 通りです。120通りのブランデーモカを作って美味しい配合を見つけるよりもベイズ最適化を使った方がコスパが良いですね!。特にお酒は大量には飲めませんから…
もちろんブランデーモカだけではなく他のお酒の配合もこの方法決定することができます。もちろんお酒以外のことにも応用できます。
せっかくなのでちゃんとカクテルっぽく作ってみました。実験ではクリームはそのまま混ぜてみましたが、今回はホイップして注ぎました。
最後にチョコレートを浮かべたのがこちら。
美味しそうじゃないですか!!
ただ、結構強いお酒なので飲み過ぎには注意してくださいね〜
…長々とくだらないにお付き合いいただきありがとうございました。明日もお楽しみに