NezumiNoKuni’s blog

日々気になったことをメモしてます。ポケモン、データ分析、育児他を予定してます。

ポケモン特性の強さの定量化

背景

ポケモンには特性がありますが、その特性の発生条件や対象・その効果は多様で、具体的にどの特性がどれだけ強いかは不明です。

なんとなく、強い特性はわかるものの、二つの特性を比べてどっちが強いかは人によって変わりそうです。

将来的に、ポケモン種族値、タイプ、特性、わざからどれだけ強いか定量的に評価するため、ちょっと手が付けにくそうな種族値定量化をやってみます。

参考

色々な方がランキングをつけてくれています。当然、実際のランクマッチでの感覚のほうが信頼できるため、一覧にします。

※元のものから、同じ効果の特性(たとえばリベロへんげんじざい)を併記・追記してます

それぞれのランキング理由や、対象ソフト、そもそもダブルも含んでるかがあいまいだったりするので、ずれがありますが、だいたい上位は重複してます(表の色)。

方法

最終的に以下の方法をとりました。

シングルのランクマッチで、上位150位以上で複数の特性を覚えるポケモンに対して、以下を仮定します。

  • 1番採用率が高い特性は、2,3番目に強い特性よりも強い。
  • x倍高いと、値がlog(x)高い。ただし最大3。合計は0。
  • 対象はSV(14), SWSH(23), SM(4), ORAS(17)。()はシーズン。
  • こうげきととくこう、ぼうぎょととくぼう、すべてのタイプは入替え可能。例えばこうげきを上げる特性ととくこうをあげる特性は同じ値。
  • 1種類の特性のみのポケモンは無視。
  • 特性の効果がソフトで変わっても、考慮せずに同じとみなす。

はじめにすべて0に設定し、差分を繰り返し足していって、収束するまで繰り返します。

結果

感覚的には、強い特性の"がんじょう"よりも更に採用されている"きよめのしお"はめちゃ強い。

上位30個のうち、参考に示した中にでなかったのは半分(表の太字)。

ちょっと、うまくないかな?と思ったのですが、"ばんけん"や"はりこみ"以外は割と強いんじゃないか?じきゅうりょくとか。フィルターも強すぎるか?

結局、納得感があるかどうかだと思いますが、簡単に定量化できるわりに、いい感じだと思います。どうでしょうか?

特性 効果
1 きよめのしお 3.9 状態異常にならず、XX技を受けるとき相手のこうげき・こうげきを半減させる。
2 フィルター 3.6 受ける効果抜群のわざのダメージが0.75倍になる。
3 ファーコート 3.3 ぼうぎょが2倍になる。
4 ひでり 3.2 場の天気をにほんばれにする。
5 どくげしょう 3.1 物理技を受けたとき、相手の場をどくびし状態にする。
6 すいほう 3.1 XXタイプのわざを受けるとき、相手のこうげき・こうげきを半分にする。やけど状態にならない。XXタイプのわざで攻撃するとき、こうげき・こうげきが2倍になる。
7 ヒーリングシフト 3 HPを回復するわざの優先度を3高くして出せる。
8 かげふみ 2.7 相手を逃げられなくする。
9 ちからもち 2.7 こうげきが2倍になる。
10 スキルリンク 2.7 連続攻撃技を常に最大回数出せる。
11 いたずらごころ 2.6 変化技の優先度を1高くして出せる。
12 はやてのつばさ 2.6 HPが満タンのとき、XXわざの優先度を1高くして出せる。
13 パンクロック 2.5 使用する音のわざの威力が1.3倍になる。受ける音のわざのダメージが半減する。
14 てきおうりょく 2.4 タイプ一致のダメージ補正が1.5倍から2倍になる。
15 じきゅうりょく 2.3 攻撃技を受けるとぼうぎょが1段階上がる。
16 どくのくさり 2.3 攻撃技を使ったとき、相手をもうどく状態にすることがある。
17 がんじょうあご 2.3 かみつきわざの威力が1.5倍になる。
18 しゅうかく 2.2 消費したきのみを復活させることがある。
19 ふゆう 2.2 地面にいない状態になる。
20 いかく 2.1 場に出たときに、相手のこうげきを1段階下げる。
21 グラスメイカ 2.1 場の状態をグラスフィールドにする。
22 ばんけん 2 いかくを受けるとこうげきが1段階上がる。相手の交代させる技やレッドカードの効果を受けない。
23 きれあじ 2 切る技の威力が1.5倍になる。
24 もふもふ 2 受ける直接攻撃のダメージが0.5倍、XXわざのダメージが2倍になる。
25 かそく 1.9 毎ターンすばやさが1段階上がる。
26 はりこみ 1.9 交代して出てきたポケモンに攻撃するとき、こうげき・とくこうが2倍になる。
27 テクニシャン 1.8 威力が低いわざの威力が1.5倍になる。
28 じょうききかん 1.8 XXタイプかXXタイプのわざを受けるとすばやさが6段階上がる。
29 かわりもの 1.8 場に出た直後に相手にへんしんする。
30 マジックミラー 1.7 常にマジックコート状態になる。

生成AIによる技術士試験回答(2次試験必須1)

概要

生成AIを使って、技術士2次試験の小論文に対応できるか試してみました。

背景

2021,2022年度に技術士試験を受験したのですが、そのときに苦労したひとつが、まわりに技術士の方が少ないと、模範解答例や解答方法がわからないことでした。結局、sukiyaki塾などにお世話になりながら、なんとか合格できたのですが、最近のAI事情から「これ生成AIでいけるのでは?」と思ったので、試しにやってみました。

技術士受験を応援するページSUKIYAKI塾

技術士事情

令和4年度建設部門必須科目Ⅰー1に対してです。公式に問題がありますが、DXに関してです。

09 建設部門|公益社団法人 日本技術士会

技術士の形式は定期的に変わりますが、令和になってから問1は小問4つからなり、テーマに対する背景が与えられるなか、

  1. その課題
  2. 重要課題の選択とその解決策の提案
  3. そのリスクや波及効果
  4. 技術士として考慮すべき事項(倫理+環境)

を1枚600文字x3枚の原稿用紙(改行合わせてだいたい1500字+α)を90分で回答する、というものです。

生成AI事情

以下のようにブラウザで実行できるものがあります。(日本語特化は詳しくないため、未検討)

ちょうどタイミングを同じくして、Claudeが2から3になりました。

https://www.anthropic.com/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2F4zrzovbb%2Fwebsite%2F9ad98d612086fe52b3042f9183414669b4d2a3da-2200x1954.png&w=3840&q=75

今回関係ありそうなモデルの良さを評価するベンチマークだと、MMLU (Massive Multitask Language Understanding)またはGLUE (General Language Understanding Evaluation)あたりで、記事だとClaude3がTopと出てますが、正直僅差で、そろそろこのベンチマークも意味なくなってくるんじゃないかと思ってます。

方法

知りたいのは主に2点。

  1. どの生成AIがよいか。どれだけできるか。
  2. どのようなプロンプトがよいか。

まずは雑なプロンプトで回答を生成し、 これに、技術士の対策講座をおこなっている方を追加した回答案(以降、技術士回答案)を、再びChatGPTに回して点数付けしてもらいま...と思ってましたが、どうも私の点数感覚とずれているため、完全に独断で判定します。

プロンプトは基本的に共通ですが、Claudeのみ動かなかったため、フォーマットを省きました。

そのあと、プロンプトを煮詰めます。といっても、すぐに環境変わりそうなので、若干です。

AIを操る「プロンプトエンジニア」がAIによって駆逐されつつある - GIGAZINE

採点方法

当然、技術士の評価方法などは、公式ページの

などに書いてあります。

項目
専門的学識 専門の技術分野の業務に必要で幅広く適用される原理等に関わる汎用的な専門知識を身につけているか。
問題解決 社会的なニーズや技術の進歩に伴い,社会や技術における様々な状況から,複合的な問題や課題を把握し,社会的利益や技術的優位性などの多様な視点からの調査・分析を経て,問題解決のための課題とその遂行について論理的かつ合理的に説明できているか。
評価 解決策の実施に伴う新たなリスク(解決策が実現したがために生じる二次リスク、あるいは解決策の実現を阻むボトルネック)とその対応策を考察することができるか。
技術者倫理 公益確保(公共の安全と環境の保全)のためにどのような懸念と対応をすべきかを倫理(公共の安全)と持続可能性(環境の保全)について考察できるか。
コミュニケーション 的確な文章表現ができるか、読みやすい答案か。

結果(生成AI比較)

まず、生成AIの比較。

  • ChatGPT: (唯一課金しているが)総合的に一番良さげ。その他の詳細は後述。
  • Copilot: (当然だが)基本的にChatGPTと同様。
  • Gemini: まず、フォーマットや字数について従ってくれない。箇条書きでは書いてくれるが、精査が大変。
  • Claude: フォーマットには一番従ってくれるが、字数には従っていない。内容は納得感がある。
  • Llama : (私が扱いになれていないのもあるが)他のと少し勝手が違う。最大Tokenを増やしても途中で止まる。スマホからだと実行が厳しく、うまく回ってくれるとかなりよさそうなものを出してくるが、安定しない。

内容については、正直大差がなく、これは追加情報がやっぱり必要かなという印象です(後述)。とりあえず安定してそれなりに実行できるChatGPTが総合的にはよいと判断しました。

結果(回答案に対する感想)

生成AIに書いてもらった回答案に対する、私の感想は以下。だいたいどの生成AIでも、プロンプトを変更しても感想は変わらなかったです。入力・出力ともに大きすぎるため、分けてやったら少なくともフォーマット問題ぐらいは変わるかもしれません。

  • [全体] Claude以外だと、フォーマットや語調が安定しない。技術試験はあくまでも回答者からの提案という体をとるため、それが崩れると急に読みにくくなる。
  • [1. ](回答案になれてないのもあり、)回答がどう多面的に課題を抽出したかがわかりにくい。
  • [2. ](今回テーマがDXということもあるが、)答案が建設技術者としての回答となっていない。
  • [3. ] 懸念事項の内容は浅く、それ以前に予想がついてしかるべき内容が多い。例えば以下の最終回答案だと、生産性向上を波及効果に挙げているが、本来DXの目的はそのあたりにあるはずなので、波及効果とは呼びにくい。よくやる手では海外展開や競争力とかを挙げるのが(少なくとも2022年頃の)よくやる手。
  • [4. ](特に倫理について、)問題文やプロンプトをほとんどコピペしたものにすぎず、内容が浅い。

最終回答案

下に載せたプロンプト4の結果です。読みやすさのため、カッコで章立てを追加しました。

ステップバイステップにしたためか、むしろ字数オーバーで2400字程度になってます。

生成AIが出したのをフォーマット調整しなきゃいけないのは、本末転倒感いなめないですが、字数や文の結びやフォーマットなどをしっかりやれば、合格ラインを超えるくらいはいけるのではないでしょうか?

(1)
課題1: データ管理と利活用の不足(観点: データの共有と活用)
建設プロジェクトには膨大なデータが伴うが、これらのデータはしばしば非効率的に管理され、利活用されていない。標準化されていないデータフォーマットや、異なるシステム間でのデータ互換性の欠如が原因である。結果として、プロジェクトの効率性が損なわれ、コスト削減や品質向上の機会が逃失されている。
課題2: 技術者のデジタルスキル不足(観点: 人材育成)
建設業界では、デジタル技術の急速な進化に対応するためのスキルを持った技術者が不足している。これは、既存の教育体系が新しい技術やデジタルツールの教育に対応していないこと、及び既存の技術者が新しい技術への適応に抵抗があることに起因している。このスキルギャップは、DXの推進を遅らせ、業界全体の競争力を低下させる。

課題3: 官民データの連携不足(観点: データ連携)
官民間でのデータ共有は、インフラ整備や都市開発プロジェクトの効率化に不可欠である。しかし、行政と民間企業間でのデータフォーマットや利用ポリシーの違いが、効果的なデータ共有を阻害している。これは、データを利用した意思決定の機会の損失や、プロジェクトの遅延を引き起こしている。

これらの課題の原因は、デジタル化への投資の不足、教育体系の遅れ、及び官民間の連携機制の欠如にある。これらの問題を解決するためには、組織的な変革、教育プログラムの改善、及び官民パートナーシップの強化が必要である。実際の社会経済情勢や技術進歩を踏まえ、建設業界におけるDXの推進は、これらの課題に対する具体的なアプローチと深い理解を要する。

(2)最も重要な課題
最も重要な課題として、技術者のデジタルスキル不足を挙げます。この課題に対処することで、建設業界のデジタルトランスフォーメーション(DX)を加速し、業務の効率化、コスト削減、そして新たなサービスの創出が可能になります。

解決策1: 継続的な教育プログラムの導入
継続的な教育プログラムは、技術者が最新のデジタル技術を学習し続けるための基盤を提供します。オンラインプラットフォームを活用し、柔軟な学習スケジュールで最新のコースを提供することが重要です。このアプローチにより、技術者は自身のペースで学習を進め、新しいスキルを効率的に習得できます。

解決策2: 実践的なトレーニングとプロジェクトベースの学習
実践的なトレーニングを通じて、技術者はデジタル技術を現実のプロジェクトに適用する経験を積むことができます。プロジェクトベースの学習では、実際の課題を解決することで学び、理論と実践のギャップを埋めることができます。このアプローチにより、技術者は新しいスキルをより深く理解し、実際の作業環境での適用能力を高めることができます。

解決策3: 産学連携によるカリキュラム開発
大学や専門学校と業界が連携し、現代の建設業界が直面する課題に対応したカリキュラムを共同で開発します。この産学連携により、教育機関は最新の業界ニーズに基づいた教育を提供でき、学生や既存の技術者に対して、即戦力となるデジタルスキルを育成できます。

実行可能性と効果
これらの解決策は、建設業界のデジタル化を促進する上で実行可能かつ効果的です。継続的な教育プログラムと実践的なトレーニングは、技術者のスキルセットを迅速に更新し、デジタルトランスフォーメーションに対応する能力を高めます。産学連携によるカリキュラム開発は、教育機関と業界のギャップを縮小し、新しい世代の技術者に対して、現実の業界課題を解決するための知識とスキルを提供します。これらのアプローチにより、建設業界全体のデジタル化が促進され、生産性の向上、コスト削減、そして新たなサービスの創出が実現可能になります。

(3)波及効果とリスクとその解決策
提案した解決策の実施による波及効果は、建設業界の生産性向上、コスト削減、そしてイノベーションの促進に大きく寄与すると予想されます。継続的な教育プログラムと実践的なトレーニングにより、技術者は最新のデジタル技術を効率的に習得し、それを実際のプロジェクトに応用することができるようになります。これにより、プロジェクトの実施期間の短縮、エラーの減少、そして最終的なプロジェクトの品質向上が期待できます。産学連携によるカリキュラム開発は、教育システムと実務の間のギャップを埋め、将来の建設業界を支えるデジタルスキルを持った新たな人材の供給源となります。

しかし、これらの解決策の実施には新たなリスクや問題点が伴います。技術者のプライバシーやデータの安全性に関する懸念が挙げられます。継続的な教育やデータ共有の過程で、個人情報や機密情報が漏洩する可能性があります。これに対する対応策としては、教育プラットフォームやデータ共有システムに厳格なセキュリティ対策を施し、定期的なセキュリティ監査を行うことが必要です。また、技術者に対してデータプライバシー保護と情報セキュリティの重要性に関する教育を強化し、意識を高める必要があります。これにより、デジタル技術の利用が進む中で、技術者個人と建設業界全体のセキュリティとプライバシーを守ることができます。

(4)技術者の責務
DXの推進において、技術者は公共の安全、環境保護、データプライバシーの保護といった要素を倫理的な考慮事項として重視することで、社会の持続可能性に貢献できます。デジタル技術を利用して建設プロジェクトを効率化することで、資源の無駄遣いを減らし、環境負荷を低減します。また、データを安全に管理し、個人情報を保護することで、社会の信頼を維持し、技術者としての責任を果たします。技術の進歩を社会全体の福祉向上につなげることが、技術者の倫理的義務であり、持続可能な未来への貢献です。

Prompt

回答生成用(1初期)
建設業の技術者として、以下の背景を考慮しつつ、次の問いに1500字程度で答えよ。

### フォーマット
回答の際には、末尾は「である」「する」にし、以下のフォーマットに従ってください。XXXには適切な言葉を入れてください。
(1) XXXの課題
1. XXX (XXXの観点)
XXX
2. XXX (XXXの観点) 
XXX
3. XXX (XXXの観点) 
XXX
(2) 最も重要な課題とその解決策
XXXの理由から、XXXが最も重要と考える。その解決策として3点挙げる。
1. XXX
XXX
2. XXX
XXX
3. XXX
XXX
(3) 波及効果と懸念事項への対応策
1. 波及効果
XXX
2. 懸念事項
XXX
(4) 技術者倫理と社会持続性
1. 技術者倫理
XXX
2. 社会持続性
XXX

### 背景
略

### 問
略
回答生成用(2)

結果的には、実は上で出したのからほぼ進化してないのですが、評価項目が全く入ってないため、それを加えました。

回答生成用(3)

技術士が書いた答案をつくれるようなプロンプト自体を、ChatGPTに聞き、それに字数などを追加しました。

回答生成用(4)

国土交通白書をアップしまして、ステップバイステップで回答してもらいました。

あなたは建設技術士試験のために、建設業界におけるデジタル・トランスフォーメーション(DX)の推進に関連する複雑な問題を解決する課題に直面しています。この試験では、あなたの専門知識、問題解決能力、評価能力、技術者としての倫理、およびコミュニケーション能力が評価されます。以下の問題に対して、具体的かつ詳細な回答を提供してください。
専門的学識: 建設業界においてDXを推進する上で直面する三つの主要な問題(あるべき姿と現実とのギャップ)を多様な視点で特定してください。それぞれに対して、建設業界における具体的な知見(例えば添付の国土交通白書など)に基づき、なぜこれらが課題となるのかその原因等(なぜ・どのようにその問題が発生しているのか)を500字程度で解説してください。
問題解決: あなたが特定した課題の中で最も重要だと考えられるものを選び、その課題に対する具体的な解決策を三つ提案してください。提案する解決策の実行可能性と効果について詳細に500字程度で説明してください。
評価: 提案した解決策の実施が建設業界や社会基盤に与える具体的な波及効果を評価してください。また、実施に伴う潜在的なまだ述べていない新たなリスクや問題点を特定し、これらに対する対応策を具体的に300字程度で示してください。
技術者倫理: DXの推進を通じて、技術者としての倫理的な考慮事項と社会の持続可能性にどのように貢献できるかについて200字程度で述べてください。この際、公共の安全、環境保護、データプライバシーの保護などの要素を考慮に入れてください。
あなたの回答は、専門的な内容を正確に、かつ読み手に理解しやすい形で提供されることが求められます。文章は、一貫して「である調」を使用して記述してください。あなたの回答は、提出された各項目に対して、建設業界における深い理解と具体的なアプローチを示すものでなければなりません。また、実際の社会経済情勢や技術進歩の事例を引用し、提案の妥当性を支持することが期待されています。
採点用
今から技術士試験の回答案を示します。建設業の技術者としてふさわしいかを考慮し、以下の採点項目をそれぞれ100点満点で採点したのち、問題点をあげてください。

# 採点項目
専門的学識=専門の技術分野の業務に必要で幅広く適用される原理等に関わる汎用的な専門知識を身につけているか。
問題解決=社会的なニーズや技術の進歩に伴い,社会や技術における様々な状況から,複合的な問題や課題を把握し,社会的利益や技術的優位性などの多様な視点からの調査・分析を経て,問題解決のための課題とその遂行について論理的かつ合理的に説明できているか。
評価=解決策の実施に伴う新たなリスク(解決策が実現したがために生じる二次リスク、あるいは解決策の実現を阻むボトルネック)とその対応策を考察することができるか。
技術者倫理=公益確保(公共の安全と環境の保全)のためにどのような懸念と対応をすべきかを倫理(公共の安全)と持続可能性(環境の保全)について考察できるか。
コミュニケーション= 的確な文章表現ができるか、読みやすい答案か。

# 問題
略

# 回答案
略

AIによる採点結果

ちなみに、ChatGPTによる採点だと、それぞれの初期回答案は以下になりました。私の感覚とは全く違うので、意味はないのですが、面白いので。

採点項目 技術士 ChatGPT Bing Gemini Claude
専門的学識 80 85 88 92 90
問題解決 85 90 95 92 92
評価 75 80 85 88 88
技術者倫理 90 95 93 94 94
コミュニケーション 85 88 90 89 89

技術士自体の答案がすべての項目で一番悪く、ChatGPTが次点。箇条書きで返してきたGeminiが一番良い。

感覚的に、生成AIだと文章のフォーマットなどのできは全く気にしなくて、キーワードの羅列だけでも勝手にその間を埋めようと読み取ってくれるのかなー。と感じました。

まとめ

普段、日常から仕事までよく使うようになって、試しにやってみましたが、最低ラインは超えたかなという印象です。

むしろ結果の採点が予想以上に大変そうで、自分が受けた印象とのギャップをどう埋めていけばいいか、想像できません。なにをもって人間は良い・説得力ある文章と思うのか。

また、最近図の読み取り能力も優れてきたらしいので、図面の読み取りによる専門問題もチャレンジはできるのでしょうか。

カンドゥー(Kandu)@幕張_part2: 残り枠の推移

概要

Kanduの人気の仕事は、予約のうまり方がえげつなかったので、調べました。予約の参考に。

nezuminokuni.hatenablog.com

経緯

ディズニーの混雑状況をまとめてるサイトは前からお世話になってたのですが*1、Kanduでは似たようなのはありませんでした。なので、とりあえず5日だけ推移を調べています。

残り枠の推移

とりあえず結果。枠組みを一括して、残り人数の推移をみます。(例えばモデルは6人x4枠=24人が合計なので、これがどう減っていくか)

Note: 縦軸は開始時刻を基準にした時間。全仕事を載せるとみにくいため、最初の135分までに残数が0になったやつのみ載せ、他はその他で名前のみ。0になったあとに、予約取消しで戻ることがありますが、見やすさのためそれは除外。

ほぼ生データ、たぶんはじめて見る人には見にくい(醜い)図ですが、がんばって見てもらえると理解が進む気がします。

先行入場の方が、予約開始が25分前ごろからはじまり、人気のものは開始前から埋まっていきます。(例えば、2枚目の土曜午前のアイスクリームメーカー

Top10以外で、最後数席の減りが遅いように見えます(気のせいかも)。

途中で一気に5-10人ほど定期的に階段状に減っていくのは、予約がうまらなかったためです。

残り枠0となった時間

つぎに「いつ残りの予約枠がゼロとなったか」だけを、見やすさ重視でTop10仕事で整理します。

Note: 仕事横の()はその期間の仕事に参加できる枠。右側はPM。

「土日のほうが圧倒的な激戦区」のイメージで、確かにある程度その通りでしたが、思ったより差は小さそうです。考えられる理由としては、

  • 平日でも定員いっぱいまで入っているから
  • 平日は午前のみのため

あたりでしょうか。

他に目につくのは、

  • 土日の午前・午後は午前は午前のほうが混む。
  • ゼロになるまでの時間はTop5を除くと、日によるばらつきが大きい。
  • 歯科医ってそんな子供に人気だったの?

あたり。

感想・まとめ

予想以上にデータが多く、整理に手間取ったため、取り急ぎ。もっと丁寧に分析したいと思っています。日によってばらつきが激しい仕事があるので、もしかすると「残り少なくなったから早く予約しなくては!」的な動きなどがあるのか?など期待しています。

基本的には仕事の優先順位つけて、やりたいのから予約するので、上の図で足りると思ってますが、もし、こういう図だと見やすい・見たいなどの要望ありましたら、連絡もらえると嬉しいです。

以上

Imitationによる報酬関数の可視化

概要

Imitationを使って、報酬関数の可視化を行いました。

https://imitation.readthedocs.io/

Center for Human-Compatible AI, ver 1.0

背景

GAILは、生成的敵対ネットワーク(Generative Adversarial Networks, GANs)の概念を応用して、専門家のデモンストレーションから、専門家の振る舞い(policy)を模倣するGeneratorと、専門家の行動とエージェントの行動を区別するDiscriminatorとの間で敵対的な学習を行います。

強化学習はこのDiscriminatorからは、逆強化学習の枠組みの中で報酬関数が学習されます。が、この報酬関数の実装例が見つからず、変なところで苦戦したため、メモします。

勉強はじめでよくわからないところが多いため、間違っているところありましたらご助言いただけるとなによりです。

方法

ここでは、Stable baselines3と、Imitationのライブラリを使っています。 状態の理解が楽なため、問題にはOpenAI gymのCartPole-v0を使います。

CartpoleはCartの上に立ったPoleを倒さないように、Cartを右左に動かすゲームです。直感的に理解がしやすいですが、基本的な方程式の説明は、以下などにもあります。

https://brain.cc.kogakuin.ac.jp/~kanamaru/NN/CPRL/index-j.html

Imitationのチュートリアルのところは省略します。

  • エキスパートデータの作成(sealsから)
  • GAILで学習(チュートリアルまま)
  • Policy, Reward_netの取得(念のため保存)
  • エキスパートデータでの報酬の推定
  • シミュレーションでの報酬の推定
  • (追加) AIRLで同様

報酬関数

肝心の報酬関数の呼び出しは簡単で、

reward_net.predict(obs_tensor, act_tensor, next_obs_tensor, done_tensor)

はじめChatGPTに聞きながらやっていたところ、

reward_net(obs_tensor, act_tensor, next_obs_tensor, done_tensor)

と言われ、そこからテンソルの次元が合わないエラーがでて、あれこれやって、 一時的にreward_net.use_done = True、にしたら次元があうけど、それでいいのか?と悩んで、中身見て、一つ一つ理解していったら、、、。と無駄に時間をかけました。

やはりPytorch勉強しなくては。

def estimate_reward(obs, act, next_obs, done, reward_net):
    # 観測値、行動、次の観測値、および終了フラグを適切なテンソル形式に変換
    act = np.array([act])
    done = np.array([done])
   
    obs_tensor = torch.as_tensor(np.copy(obs), dtype=torch.float32).unsqueeze(0)
    act_tensor = torch.as_tensor(np.copy(act), dtype=torch.float32).unsqueeze(0)
    next_obs_tensor = torch.as_tensor(np.copy(next_obs), dtype=torch.float32).unsqueeze(0)
    done_tensor = torch.as_tensor(np.copy(done), dtype=torch.float32).unsqueeze(0)

    # reward_netに入力して報酬を推定
    with torch.no_grad():  # 勾配計算を行わない
        reward = reward_net.predict(obs_tensor, act_tensor, next_obs_tensor, done_tensor)
    return reward.item()

可視化

いきなりですが、報酬を可視化します。

CartPoleの状態は4次元で、

  • Cartの位置: -4.8~4.8
  • Cartの速度: -Inf~Inf
  • Poleの角度: -24~24[rad]
  • Poleの角速度: -Inf~Inf

なのですが、カートの位置は意味がないように思えるため無視して、Volocityが0.1より大きいか小さいかと、更に実際のactで分け、残りの2次元で可視化します。*1

Poleが左に倒れそうなときは、Cartも左に動かしてやるのが正解な動かし方です(たぶん)。

各図の第3象限(左下)がその状態で、cとdを比較するとcの報酬が大きく、すなわちact=0で、左に移動するのが好ましくでています。 同様に第1象限はPoleが右に倒れそうなときなので、右に動かしてやるのが正解で、bは正しくaより大きい報酬となっています。

ただし、本来物理的な意味を考えると、正負で反対の結果になるはずなので、bとc、aとdは同じような結果になるはずですが、なぜか角速度が負で速度が正の場合(両者は強い相関あり)は報酬が小さくなっています。エキスパートデータに偏りがあるかとチェックしましたが、そうでもないよう。要確認。AIRLを試したところ、概ね解決しました。

シミュレーション

以上は、エキスパートデータを使っていたので、Actに対する報酬は実は違う状態を比較していたため、シミュレーションし毎回非推奨側の行動の報酬も推定してみます。最大Stepを20回にして、計10000step。

図はPolicyが推奨した行動に対する推定報酬と、非推奨行動の推定報酬。

全然、ちゃんと報酬推定できてないじゃん(笑)。推奨行動の報酬が大きい割合が50%と、完全にランダムじゃん。

と思ったのですが、当然Stepに制限をかけないと、いつまでも動き続けるので、減衰なしの累積報酬和の利得を見てみると、

ちゃんと、推奨行動側の利得がほぼ100%で大きくなっています。よかった。

自分なりの理解を書くと、棒があんまり倒れていなく、どのような行動でもそんなすぐに終了に繋がらないような場合、報酬の推定は重要でない(重要なのは利得)。CartPoleは実際にプレイするとわかるのですが、actに対してVelocityが飛び飛びでめちゃくちゃ動くので、中立付近ではどちらでもよいのでしょうか?

一方で、非推奨行動の報酬が非常に小さい場合、それは回避する。その結果、利得は大きくなり、行動も続けられる。

ただし、より広い範囲をみる目的で、40%程度の確率でランダムに行動するようにしたところ、報酬和で推奨行動が必ずしもよくなっていないことも増えてきたため、要確認です。

追記(AIRL)

GAILは実装例を見ていたこともあり馴染みがあったのに対し*2、AIRLはそんな変わらないとたかをくくってやったことがなかったのですが、試しにやってみたところ、報酬関数が状態の正負において対称に近いかたちになって、GAILよりもそれっぽい形になりました。(Step数他はチュートリアルと同じ)

ただ、1回ごとの推奨行動と非推奨行動の報酬は、GAILと同様に50%にわかれて、学習できているのか、いないのかよくわからないのは、かわらず。

LogPとの比較

そもそも、逆強化学習をしなくても、方策のみから状態価値と行動の対数尤度は簡単に出力できます。

AIRLでの行動の対数尤度は下図ですが、ほとんどrewardと違いがわかりません。省略しますが、状態価値も傾向はかわらず。

教科書でも読んで勉強しろよという感じですが、逆強化学習強化学習の一部として教科書にはちょろっと1p程度触れられる程度。

当然、価値関数は長期的な報酬和であることはわかっていますが、感覚的に、エキスパートデータのみから、詳細な報酬を推定できるわけない気もするので、行動価値関数とだいたい一緒になるとしたら、まーそうだろうな。

だとすると、逆強化学習の価値は、あくまでも強化学習をおこなうための報酬関数を推定してくれることのみ、にあるのでしょうか?

雑記、疑問点

  1. そもそも報酬の推定に、next_obsが必要なのってなんでだろうか?それが強化学習と言われればそれまでだが、逆強化学習の観点からすれば不自然でないか?next_obsが必要だと、環境とのやり取りができない場合に、実際に行動した側のnext_obsしか得られなく、もう一声。

  2. reward_netは、gail_trainer._reward_netにあるようですが、先頭に1つのアンダースコアついてるけど、保存から再読込してもよいんだろうか?

*1:Velocity=0付近は混合していて、図が少し見にくかったため

*2:https://tech.morikatron.ai/entry/2020/10/12/100000

カンドゥー(Kandu)@幕張でお仕事体験

概要

先日夫婦+5歳の娘とKanduに行き、あまりの忙しさにカルチャーショックを受けたので、当日の様子を紹介します。

事前知識

幕張イオンにあるKanduは子供がお仕事体験できる遊び場です。企業や自治体がブースを出して、仕事のイメージを小さいうちから持ってもらうのが趣旨だと思います。

www.kandu.co.jp

2024年の2月の日曜日午前にいった感じでは、

  • 他のイオンのお店は10時前には開いてないため、「Kanduの方はこちら」という案内があり、そこから入る。
  • チケット購入時には受付時間が9:15-9:45までに5分区切りであるもよう。
  • 当日朝みた限りでは1列あたり20-40組程度なので、代替150組くらいの参加でしょうか。*1

  • (日や時間によって違うかもですが、)職種は36種で計156名参加可能なため、だいたい同じ数になる。

  • 各ブースへの参加方法は、予約かその場参加の2通り。
  • 予約は館内の決まった場所で行える。予約は25分に1回できる。
  • その場参加の場合、体験ブースの前に並び、はじまる時間に空きがあれば参加できる。
  • 予約の混雑状況はブラウザで確認できる(以前は館内のデカいモニタに映るのみ)。
  • 1つの体験は、ブースによって時間が違い、15-45分くらい。

注意点

特に入館直後がかなり忙しいです。*2

下は開始時間前の予約画面ですが、すぐに人気の仕事からうまっていきます。食べ物系はだいたい人気です。

初めていく方は、私以外の方が体験談を丁寧に書いてるので、そちらを丁寧に読んでください。どうしてもやりたいものは初めに予約して、予約は後の時間から埋めていくのがよいようです。というのも、そうしないと後半(例えば12時過ぎごろ)には、ほとんど埋まっていて、全く参加できないという事態に陥ります(予約不要のものが何個かあるものの)。

致し方ない気もするが、初見殺しに近いので、なんとかならないかなー。おそらく全参加者が希望順に頭から予約していけば、そんなことにならないんでしょうが、少数でも後ろから予約していくとそちらが有利になってしまうため、結果みんなそうする(たぶん経済学で名前がついていそう)。

と、良いのかどうかは知りませんが、皆さん席に荷物をおいて参加してます。 人数が少なければ、特に決まった席がなくても困らないかもしれませんが、子供がどこかに行ってしまった際に帰ってくる場所としてもあったほうが安心できます。

当日のスケジュール感

こどもとおやの、当日のスケジュールです。親のすき間時間は、だいたい子供が体験してるのを写真にとってます。

とにかく入館直後が怒涛の忙しさです。9:25の受付で45分くらいまでゆっくり列が進んで入場します。

まずは子供が絶対やりたいと言っていた「モデル」を予約1しつつ、席を確保し、更に開始から暇になるといけないので、携帯で10時からの空きを見ながらそれっぽいところに並びます。開始して子供が体験はじめたら、仕事着に着替えてる最中に次の予約2をして、体験に参加(JALのCAだったため、親も乗客として)しつつ一時休憩。

1つめが終わったら、(二手に分かれて)次の予約3しつつ、次に空いてるのを探します。娘のやりたいのを尊重したいのですが、娘はモデルがやりたいので、基本的には親が主導で探します。予約がうまってなく、かつすぐに次がはじまりそうで、並びもそんなに長くなく、娘も気に入りそうで、その次の予約時間にもかぶってない...と複数の条件から最善を探します。親も何かの敏腕マネージャーになる体験ができます。

ここまで来れば、親はだいぶゆっくりしていいです。予約するとかえって時間拘束されそうだったので、あとは流れに任せることにします。娘が体験してるのを横目に見ながら、席に座って休憩できます。席にある昼のメニュー表を眺めながら、Kandu終わってからのことを考えます。

お昼の注文から来るまでに時間がかかると面倒になると思ったので、早めに注文しましたが、どうせ昼はゆっくりしたいので、どちらでもよかったかな、という印象です。

出し入れ

スケジュール以外で面倒だったのは、チケットなどの出し入れです。A4のクリアファイルでチャレンジしましたが、出し入れの機会が多く手間取りました。小分けにできる仕組みが必要です(たぶんポケットが多い鞄でしょうか?)

当日受け取るものが、以下。

  1. チケット(予約に必要)
  2. 地図&説明書
  3. カッチン(Kanduの通貨)
  4. お土産(各企業のシールやバッチなど、たまにでかいのあり)
  5. はんこ帳
  6. 予約券

1,2は基本的に親のみ。5,6は参加するときに子供が持ってる必要あり。3-5は仕事終わりに子供から返される。5のはんこ帳は次回に引き続き使える。これは我が家だけかもだが、途中で参加企業がかわったらしく2枚あり、初めての体験かどうかで切り替える必要ある。わかりにくい。

つまりはんこ帳を2つにわけると、計7種あって、毎回出し入れするのはけっこう面倒ですよ。

ふりかえり

結果的には、比較的長い仕事を二つ選んだおかげで、その間はゆっくりでき、子供にとっても忙しすぎず暇すぎず、という適度な体験ができました。

子供と接点ができにくいはずのSECOMや東京海上日動などを知れるのはいいことだな、と単純に思っています。とくにSECOMは街中でステッカーを見つけると指さして教えてくれます(笑)

幸か不幸か某仕事体験とは違って、親が体験予約をできるため、親の忙しさが半端ないですが、おかげさまで娘はだいぶ楽しんでくれました。そのために必要なのは、子供に(優先順位付きで)やりたいこと聞いておくことと、取れなくてもおこらないで、と事前に行っておくことでしょうか。

以上

*1:asoviewの記事でコロナ以降定員が500から250人になったと情報あり。公式では見つからず現在は不明。https://www.asoview.com/note/2145/?page=7

*2:先日ディズニーでも忙しかったのですが流行りなんでしょうか?

ポケモンに似たキャラクターの画像分類

概要

CNNを用いて、pngのキャラクター画像から多項分類をしました。画像関連の勉強のため。 対象は、Palworld, Pokemon, Dragon Quest, Digital monster, Yokai-watch

経緯

ここ1年半ほどポケモンにはまっています。初代の赤緑と2代目の金銀を小学生の頃にプレイして以来、しばらく離れていましたが、最近娘と一緒にSVをプレイし始め、それをきっかけに(独りで)アルセウスをプレイしたり、ポケモン関連のYouTube動画を視聴する毎日を過ごしています。

そんな中2024年1月にPalworldが発売される前後から、キャラクターがポケモンに似ているとの指摘が増えていました。*1確かに比較してみると非常によく似ているものの、ポケモンが1000種類も存在するので、どうしても似てしまうことも避けられないだろうとも思っていました。

少し調べたところ、法律的には厳しいんじゃないかという意見が多く、特に、知的財産権に強い任天堂がどのような対応をとるのか、司法でどのような判断が下されるのか、非常に興味深いと思っています。 近年では、生成AIの進展により、元データの権利に関する問題が複雑化しており、そもそもこれから長い期間ほっとトピックになっていくんでしょう。

一方で、これって機械学習で解けるんじゃね?という。以前からCNNは、MNISTのようなチュートリアルや、否定形の時系列データのグラフを画像変換するなど、いくつか触ってみたことがあるものの、画像そのものには触れたことがなかったので、これを機に試してみることにしました。

最初は、ポケモンなどの画像からGANで学習すれば、生成と同時にdiscriminator側でポケモンの判定も可能になるため、面白いなと思いました。(ついでに最近は逆強化学習の一環としてGAILを調査しており、その下調べとしてもあり)。ただ結局、家のPCの環境ではGANは少し厳しいか、少なくとも時間がかかりそうだったため、まずは単なるCNNを使用した分類問題に挑戦しています。

画像収集

まずは、ポケモンやPalworldに似ているキャラクターでかつ、その数が多そうなので、デジタルモンスタードラゴンクエスト妖怪ウォッチを考えました(ついでにアンパンマンも考えましたが、さすがに絵柄が違うので除外)。これらをそれぞれ収集。

キャラクターの背景を白にして、128x128のRGB画像に変換しました。 元の画像の数は、それぞれ

ChatGPTから画像の数は同じくらいがいいとアドバイスがあったので、数が多いポケモン以外を左右反対も加えて倍にして、計2099枚。

方法

全体の20%をtestデータにし、tensorflowを用いて、最終的に下記のようになりました。

def convertX(path):
    img = load_img(path, target_size=(128, 128))
    img_array = img_to_array(img)
    img_array /= 255.0  # 画像データを[0, 1]に標準化
    return img_array

# 画像のパスとラベルの取得
image_paths = df['path'].values
labels = df.iloc[:, 1:].values  # 'path'列以外の列をラベルとして取得

# ラベルのエンコーディング
label_encoder = LabelEncoder()
encoded_labels = label_encoder.fit_transform(labels.flatten())
num_classes = len(label_encoder.classes_)

# 画像データの準備
X = np.array([convertX(path) for path in image_paths])
y = to_categorical(encoded_labels, num_classes=num_classes)

# データの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)

# CNNモデルの構築
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(128, 128, 3)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))

# モデルのコンパイル
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

early_stopping = EarlyStopping(monitor='val_accuracy', patience=5, restore_best_weights=True)
history = model.fit(X_train, y_train, epochs=15, batch_size=64, validation_data=(X_test, y_test), callbacks=[early_stopping])

AutoMLを使って探索もしましたが、まさかの初めChatGPTが提案したものから、batch sizeを少し大きくしたものからかわりませんでした。

全部で15epoch計算したところ、testデータのAccuracyが最大となった、epoch9のmodelを使用します。下は学習曲線

結果

まずは代表的な画像の分類結果。略称はそれぞれポケモン(PM)、Palworld(PW)、デジタルモンスター(DM)、ドラゴンクエスト(DQ)、妖怪ウォッチ(YW)。

画像内の数字は、[そのカテゴリーに分類された数 / 正確なカテゴリーのデータ数]。例えば、列がDQ,行がPMが1/823とは、823個のPMのうち1個がDQに分類された、ことを意味する。

対角に並んでるのは、正確に分類できるもの。例えばTrainデータ内の、クレベースポケモンだが、ドラクエキャラに分類されていて、言われてみればそんな気もしてくる。同じくマホイップがPalword、マシマシラが妖怪ウォッチに分類されてる。

最終的な正解率は表のような感じで、全体でtest:84%。ポケモンが90%を超えるのに、Palworldは他よりもかなり悪くて、test:34%。狙った結果ではあるんだが、思いの他悪いものの、ポケモンのみではなく、デジモン以外は均等に間違えてる。

またデジモンも正解率65%と低く、キャラはポケモンと間違われているのが多い。感覚的にはデジモンのキャラはとんがっている部分が多くてドラクエと間違えるかと思っていた。

単純な正解率にしてますが、データ数に偏りがあるので、多項分類の評価方法をもっと考えたほうがよいかもですが、とりあえず。

Accuracy[%] DM DQ PM PW YW
Train DM 94 0 2 1 1
DQ 0 99 0 0 0
PM 0 0 99 0 0
PW 0 2 1 95 0
YW 0 0 2 0 97
Test DM 65 0 25 0 10
DQ 0 96 1 0 1
PM 1 0 93 0 3
PW 2 9 29 34 25
YW 1 3 11 2 82

※合計100%にならない場合あります。

他の方にも指摘されているBushiが妖怪ウォッチと誤分類されてるから、割と納得感がある。

画像内数字は、[推定分類:その度合い]

分類がうまくいかない原因としてざっと考えられるものとしては、ゲームキャラクターのデザイナーが複数いる場合などが考えられるでしょうか?ポケモン内でも複数のデザイナーがいるはずなので、どうやって統一感を出してるのかなどがカギなのかもしれません。ポケモンのみを対象にして、デザイナー分類か、世代分類(例えば初代またはSV)できるかも問題としておもしろいかもしれませんね。

感想

  • ざっとやったにもかかわらず、なかなかの精度なのはぱっと見すごいんだが、CNNは定型的な問題にむいてるからなんだろうか?
  • やってる途中から気づいていたが、図形の時間軸を考えてないから、因果関係も当然わからない。複数の画像の類似度をかえすようなもののほうがよかったんだろうか?Cosine similarityなど。
  • 余談だが、よくある問題ならChatGPT3.5でも十分使えた。マイナーそうな問題だとcode interpreterでやってもらわないと、うそばっかりなイメージだけど。
  • 分類で99%とか言いながら間違えることが多すぎじゃね?Trainでは分類できてるから、そんな間違った推定度合いになるんだろうか?もっと自信なくてもいいのに。

疑問点、メモ

  • train側に左右対称の画像があれば、testで正解できると思ったけど、そういうわけではないのか。これらを考慮してtrain,testを分けることはあるんだろうか?
  • ベストのepochを選ぶなら、さらにvalidation用のデータにもわけたほうがよかったんだろうか?
  • ドラクエは画像の背景選択を自分でやっていて、それが影響していないか不安。
  • 画像サイズは一番小さなサイズに合わせて128にしたけど、他はそうでもないから大きくてもよかったかも?
  • 妖怪ウォッチは色違いキャラが多かったから、推定が簡単だったかも。
  • 元画像が3Dなのかなど影響ありそう。
  • XnConvertが一括の画像編集に便利。

*1:https://togetter.com/li/2302405

*2:妖怪ウォッチはもっとキャラクター数が多いはずですが、背景が削除しやすいものを選んで少なくなっている