チーズを探しに

技術寄りの事かポエムを書く。

Codex / Claude CodeにKaggle MCPを追加する

なぜかhttps://www.kaggle.com/mcpにはGemini CLIのやり方しか書いてない,というかGoogleの後ろ盾なので分かるっちゃ分かるが...

Claude Code

Gemini CLIと大体同じ.gemini -> claudeに変えるだけ

claude mcp add --transport http kaggle https://www.kaggle.com/mcp

Codex

これが少し曲者だが, ~/.codex/config.toml

[mcp_servers.kaggle]
url = "https://www.kaggle.com/mcp"
bearer_token_env_var = "KAGGLE_API_TOKEN"

を書いて,環境変数を設定するだけ

export KAGGLE_API_TOKEN="Kaggleのトークン"

Kaggle Deep Past Challenge - Translate Akkadian to English でソロ銀メダル取りました

やった!ほぼ初挑戦でこれはいい方な気がする. 反省点としては,テストデータがsentence level segmentation, trainがdocument level segmentationされてて,そのままFinetuningすると無茶苦茶LBスコアが落ちるというのがあって.train.csvのラベルを捨てるという第一位の解答が示す通りFTの前の前処理をどうするかが肝だったようです. 僕はGPTでpseudoラベル作るとか試してみたんですが,あんま上手くいかず(でも上位開放の人たちは上手くやってる,,,僕の持ってたデータが数kセンテンスだったのに対し彼らが10倍ほど多いデータを収集してたみたいでデータ量の差だったみたい?). 上位陣はアッカド語がトルコあたりの言語なので,フランス語やスペイン語等の論文も収集して,GPTでpseudoラベルを作ってたみたいです.後は前処理だな...segmentationをGPTで雑にするよりその辺を丁寧にやってた人が金に乗ってる感じがしました.要はFTで性能を落とさない.

僕はFTがダメなら事前学習をやりまくろうという方針で,継続事前学習しまくる→FTで文字出力はさせれるようにするくらいに3epochほど訓練→提出,をやってました.また,モデルをメモリギリギリになるまで大きくした(ByT5 Largeがギリのるみたいだった).

nawta won a Silver Medal for placing 27th in Deep Past Challenge - Translate Akkadian to English | Kaggle

TIER IV Autoware workshopに参加しました

12月15日〜12月19日にかけてTIER IVのAutoware workshopに参加しました!

 

AutowareとはTIER IVが開発を主導しているオープンソースソフトウェアで、本イベントはそれを実践形式で学ぶワークショップです。

 

プロダクト開発コースとMLOpsコースがあったのですが、今回僕はMLOpsコースで参加しました。

参加前はコースの内容は把握していなかったのですが、プロダクト開発コースはAutowareのアルゴリズム改良(題材としては道路上で停車してる車を避けるタスク)、MLOpsコースは 次年度のAIChallenge のプロトを体験して、大会の改善に向けた提案をするコースだったようです。

 

今回僕たちは以下のリポジトリとページを参考に、TinyLiDARNetというEnd-to-End機械学習モデルを使ってシティサーキット東京ベイをガウシアンスプラッティングしてできたシミュレーション上のサーキットをレーシングさせる事を目指しました。

GitHub - AutomotiveAIChallenge/aichallenge-2025: Japan Autonomous AI Challenge 2025

Getting started: TinyLiDARNet - 自動運転 AI チャレンジ 2025

手法としては短期間ということもあり、模倣学習で行なっていくことになりました。

ハードウェアとしては貸付されたubuntuサーバ(RTX 3070が載っていました、30万円ほどのものらしい)を使いました。

 

1日目

初登校です。環境構築を行いました。2日目までまたがるかと思いきや、帰る頃にちょうど完成しました。Pure Pursuitアルゴリズムでシミュレータ内で車を動かす事にも成功しました。

 

2日目

Pure Pursuitアルゴリズムのパラメータを変更する事でサーキットを一周させる事に成功しました。速度を落としてしまえば結構簡単に周回が可能でした。これでアルゴリズムからのデータ収集が可能になりました。

また、なぜか僕の運転が上手いということも判明しました。手作業によるデータ収集でtrain 7rep, val 3rep分取得して、+2repほどvalにPure Pursuit産のデータを入れて学習させました。学習時間としては10分もなかった気がします。結果、1個のカーブも曲がらずにクラッシュしました。右向きカーブなのに左に行こうとしてました。

 

不可解すぎて気になったため、帰宅後、自分のサーバー上でも環境構築を行って訓練データを+30rep, valデータを+10repほど入れたのですが1,2カーブ目でクラッシュ。困ったぞというところで、横の席の人が10repほどの僕の手動取得データを使っただけなのに3カーブ目くらいまで行っていたことを思い出しました。彼女はtrainとvalに同じデータを入れていたと言っていたのと、本課題の範疇内ではコースが一つしかない(=色々なコースに対する汎化性能を高める必要がない)なと思って、僕もリークさせる事にしました。小さなエポックでテストしてみたところ、リークさせた方が明らかに超えられるカーブが増えていました。

 

この時点で、リークさせた方がいい以上の情報がなく、良質なデータを増やすかモデルを改良するか学習手法の工夫か、どう手をつけていいかという状態だったので結構ピンチだなと思っていた記憶があります。

3日目中には1周させていないと木曜日に何も発表できない可能性が高まってしまうので、2日目夜の就寝時間でなるべく多くの以下のような対策をしました:

  1. データのクレンジング
    1日目のデータはrosbag取得開始から数秒ぼーっとしていたり、クラッシュしてから録画を止めたりしていたため、rosbagの開始終了前後10秒をクロップ
  2. 改造したモデルの学習
    畳み込み層+1、MLP層+1、あと残差接続をした複雑化モデル
    逆に、MLP層を減らしたり各層のパラメタ数を減らしたモデル
    時系列情報を入れたモデル(CNNに過去5フレーム分の入力をいれるようにしました。また、bidirectional LSTMも実装し、こちらは訓練時は未来フレームも参照するようにした)
    過去の自己の情報を持ったモデル(過去フレームの自己位置と加速度等を入れました)
  3. データ拡張
    シーケンスごと(つまり1つのrosbagごと)に、50%でコースとステアリングを反転させて読み込むデータローダーを実装してみました。

 

 

3日目

朝に学習済みのモデルを試したところ、すんなりと未改造のモデルが1周してしまいました。リークが効いているようです。

f:id:nawtarakan:20251221154314p:image

S字カーブの切り込みや、アウトコースからカーブに入る謎テクニックといった僕のテクニックを模倣してるのが見えて流石に嬉しかったです (後々調べたら、アウトインアウト、みたいにテクニック名が正式にあるみたいです: https://toyotagazooracing.com/jp/blogcolumn/column/349/

 

また、未改造モデルでデータ拡張の効果も確認しました。データ拡張していないデータで学習したモデルに比べると拡張済みは大体+1,2repは安定しているようでした。

他のモデルはというと、複雑化させたものはあまり動かず、簡略化のものは普通に動きました。時系列と自己状態モデルは試していません(喜びに浸っていたのと、元々レーシング目的で、あまり推論に時間がかかるモデルに対しては懐疑的だったので、TinyLiDARNetくらいの簡単なモデルが動くならそれが一番だと思います)

クレンジングの効果については、後々分かった事ですがあまり意味はなさそうでした。というのも、他の人達も充分にデータを増やし(10〜15repをそれぞれ訓練と評価に)、周回に成功していたのですが、僕の手動操作のクラッシュ部分も含んだデータだったためです。

3日目にみんな基本課題を終えたため、みんなそれぞれ発展課題に取り組む事にしました。僕は事前マップ情報を使って、周回に必要なデータを減らすことができないか調べる事にしました。

事前マップ情報のエンコーダーをいくつか作成し、学習させて眠りにつきました、、、、、

 

4日目

学習が朝起きても終わっていません。まじか!

最初のTinyLiDARNetでそんなに時間がかからない印象だったので、調子に乗ってしまい、エポック数を2倍に、サーキット環境に過学習させてもいいので,スケジューラーを入れつつearly stoppingをやめていたのが原因そうです。ワーカーとかバッチサイズちゃんと増やせるか調べていたらよかった、、

また、ros2関係のなんかよくわかんないエラーを引き当ててしまい(なんかのlaunchをするかlinstenするかしないといけなさそうだった)、シミュレータもいかれてしまいました。スライドもまだできていない。

ということで、事前マップを入れた結果は見られず発表することになってしまいました。すいません、、

f:id:nawtarakan:20251221154151j:image
f:id:nawtarakan:20251221154148j:image

 

懇親会ではFocal Loss(参考記事: https://zenn.dev/boh_mouse/articles/1e84d170b4212a )などのクラス不均衡に対する対処法をお聞きしたり,一般的に会社の業務や雰囲気など知ることができました.事故のケースは滅多に起こらないので,こういったテクニックを使えばさらにクラッシュ率が下がるのかなーとか,教師なしでも強化学習できたりするのかなーとか,考えていました.

 

 

5日目

TIER IV実証実験でバスが国際展示場付近で走っているので、それに乗せていただく事になりました。

f:id:nawtarakan:20251221154233j:image

 

感じた事としては、

良いこと

まっすぐな道だと法定速度がずっと維持されるので、ジャークがなく、手動運転よりも自動運転の方が乗り心地がずっと良いなと思いました。また、実際にAutowareがモニターに出ていて、歩行者や車がリアルタイムで映し出されていたりするのは社会実装って感じがしてめっちゃワクワクしました

信号機が赤なので止まる、といった説明もAutowareのマップ上に出ていて、説明性があるなと思いました(Waymoに乗った時の動画を今見返したら、Waymoはウィンカーの認識やSTOPサインの認識はマップ上に出してるけど信号機は出してない、なぜだ...)

 

課題

  1. ウィンカーの認識の対応がまだ
    ハイライト除去など自分が今やっている事の応用先の一つになりそうだなと思いました。
  2. 道交法を無視している車に対して、ルールベースの自動運転車だとどうしたらいいか分かんなくなったりする
    わけ分かんない状況に対しルールベースで固まるよりも、なんかしらの出力は出るので、そういう意味で今のTIER IVのMLアプローチとルールベースのハイブリッドの方向は良いのかなと思いました。

 

また、日本の事故に対する意識の高さや、それに伴う市場化のハードルの高さも感じ取る事ができました。今自動運転を先導しているWaymoやテスラがあるアメリカと比べ、日本では以下のような点から自動運転の実践と実験の難易度の差が大きい気がしています。

  1. 事故や人間の命の価値への意識がアメリカと比べて高い
    日本(+a)と比べてアメリカ(というか他の国)はなんというか、命の価値が軽視されている気がします。ボコボコの道路、人と車両の距離や荒い運転。明らかに危ない、日本の安全基準や倫理観だと許されないようなことが許されている国が多い。アメリカもそうな感じがします。これは悪いように見えますが、研究開発の土壌としてはやりやすい。
    例えばアメリカが10年で月に人間を送った背景としては、パイロットの死亡事故を伴ってもやめないほどの急進的な開発への姿勢がありました。最近の著名なLLM企業を見ても、多少の法律を逸脱した学習データを使っていたりしますね。この辺りのやっちゃえ感的なところがアメリカ企業のスピード感につながっているのかもしれません(良いか悪いかはさておき...)
  2. 車社会でデータが集まりやすく、歩行者が少ないため初級向けの実証実験が行いやすい
    Waymoは大都市でサービスを始める前に、アリゾナ州フェニックスでサービスを始めました。この都市は僕の故郷である姫路市姉妹都市であるくらいの街で、つまりアメリカの中でそこそこな田舎(ただ過疎ってはない)です。さらに歩行者がアメリカは極端に少ない国で、人を轢く可能性が日本より起こりづらい事も考えられます。Waymoはこういった開発に有利な土壌でモリモリ開発してきたんだろなと思いました。

 

余談: 開発にあたり以下のサイトがすごく参考になりました!

AIChallenge 2025の活動記 (番外編:エンドツーエンド自動運転)

 

あなたや友達のストーリーを教材に!AI語学アプリ「Realingo」


はじめに

この度初めてSwiftUIでiOSアプリを開発したので,記事にまとめました! アプリ名は"Realingo (Reality + 某lingo)"で,「自分の身の回りの実世界の写真(や音声)を題材に外国語学習ができるアプリ」というコンセプトで開発しました.
Google CloudのAPIやGGUFからのllama.cppを使ったオンデバイスGemmaといった新しく触る技術が多く,とても実用的なアプリになっていると思うので,ぜひご一読ください!

アプリのデモはこちらです:

https://youtu.be/dQVsPhqkONo

今回作成したアプリはこちらのハッカソンに応募しました!

https://zenn.dev/hackathons/google-cloud-japan-ai-hackathon-vol2?tab=rule

背景

人々によって必要な外国語の語彙や覚えるべき文章は異なる

海外旅行で使いたいフレーズ,ビジネスで必要な専門語,あるいは趣味について語るための言葉など,外国語を学ぶ目的は人それぞれです.しかし,既存の多くの語学学習アプリでは,画一的な教材が提供されがちで,必ずしも個人のニーズに合致しているとは限りませんでした.自分が実際に生活する上で出会うモノやコトに関連する語彙から学ぶ方が,より実践的に外国語能力を伸ばすことができるはずです1

興味のある教材や記憶にまつわる教材を使う勉強は効率的

学習心理学において,自分自身の経験(エピソード記憶)に関連付けられた情報は,単なる事実(意味記憶)よりも記憶に定着しやすいと言われています2.例えば,旅行先で撮った写真や,友達との思い出の写真といった個人的なコンテンツを教材にすることで,学習内容が単なる文字列ではなく,鮮明な記憶と共に脳に刻まれます. Duolingoなどはユーザによらず一定の問題を出題することになっていますが(2025年6月末現在),Realingoは,この「自分ごと化」を学習の中心に据えました.

Realingoのゴール

「自分や友達がスマホで撮った写真や音声が,教材になる」 ユーザがカメラを向けた対象・周囲の音をそのまま学習素材に変換します.並び替え問題,穴埋め問題,スピーキング,ライティング,およびお手本文章などさまざまなバリエーションにGemini APIやGemmaといった生成AIを使って変換を行います. さらに!友達の写真もあたかもSNSストーリーを見るかのように「みんなの写真」モードで課題として使えたり自分の1週間前,1ヶ月前,半年前...といったマイルストーンの出来事をアルバムを眺めるように課題として使えます. これにより,自分の身の回りの語彙や文章を集中的に取り入れ,さらに自分の記憶や興味と結びつくような題材をもとに外国語学習が可能になります!

(以降可読性重視のためである調で記述します)

アプリ概要

Realingoは,写真・音声ベースの教材の個人最適化友達との画像シェアによる学習モチベーションの維持を特徴とした語学学習アプリである.

システムアーキテクチャ

フロントエンドにSwiftUI,バックエンドにfirebaseとCloud Run Functionを使って開発した.システムアーキテクチャ図は以下である.
iOSアプリとして開発することにより,ユーザがiPhoneに保存しているアルバムに直接アクセスすることができ,画像のアップロードの工程を除けるため導線の短縮が期待できる. iOSの外国語学習アプリにおける問題文,ユーザの回答,画像のパスなどはFirebase Firestoreに保存される.画像はCloud Run FunctionのVision APIを使ってNSFWや過激な画像か否かの診断を行ったのちFirebase Storageに保存される.問題生成には,Google CloudのGemini APIと,デバイス上で動作するオンデバイスVLM(Gemmaなど)をハイブリッドで利用している.

画面構成

画面構成は以下.まずアプリを開くとトップページとしてメニュー画面*が表示される.メニュー画面から学習モードをまず選択し,それに応じて写真撮影やiPhoneの写真アルバムから抽出された画像をもとに問題が生成され,学習画面に遷移する.

*メインメニュー

機能要件

メイン機能

  1. カメラで撮影モード:目の前にある物体を撮影し,それについて問題を出力する.
  2. 思い出と学習(レミニセンス)モード:1週間前,半年前などのマイルストーンとなる時刻で撮られた写真をiPhoneのアルバムから探してきて,それについて問題を出力する.これにより,エピソード記憶と結びついた学習を促進する.
  3. みんなの写真モード: 他ユーザがクラウド(Firebase Storage)上に投稿した公開写真を使って学習できる.友達が共有した写真で学習することで,モチベーションの維持向上を図る. 誰も投稿しない場合悲しいことになる.

サブ機能

  1. 音声入力モードiPhone備え付けマイクからの音声や,音声ファイル(会議や雑談の録音など)を入力するとリアルタイムで文字起こしを行い,そのテキストを題材に学習コンテンツを生成する.
  2. スクリプトモード: CLAUDE AI Pinなど,音声ではなくテキスト文字起こしのデータしか引き出せない場合,それを入力できるモード.文字起こしされたテキストから直接学習を始められる.

出題形式

単語並び替え

DuolingoライクなUIで,提示された単語の選択肢を正しい順序に並べ替えて文章を完成させる.

穴埋め問題

文章の中にいくつか存在する空欄に,適切な単語を選択肢の中から選んで補充する.

スピーキング

提示された文章を読み上げたり,写真について説明したりする.ユーザーの発音,流暢さ,正確さをAIが評価し,具体的なフィードバックを提供する.

ライティング

写真について説明する文章などを自由記述で作成する.AIが文法,語彙,表現の自然さなどを添削し,より良い文章にするための提案を行う.

写真の説明

1枚の写真に対して,AIが学習中の言語で詳細な説明文を生成する.ネイティブの表現をインプットとして学ぶことができ,TTS(Text-to-Speech)による音声読み上げも可能.

技術

本アプリの開発で使用した詳細な技術は以下の通り.

  • フロントエンド: SwiftUI, Combine
  • バックエンド: Firebase
    • データベース: Firestore
    • ストレージ: Cloud Storage
    • 認証: Anonymous Authentication
    • セキュリティ: App Check
  • クラウドコンピューティング: Google Cloud Run (Vision APIによる画像診断)
  • 生成AI (クラウド): Google Gemini API (gemini-1.5-flash)
  • 生成AI (オンデバイス):
    • 推論エンジン: llama.cpp
    • モデル: Gemma-3-4B-it, Heron-NVILA-Lite-2B (GGUF形式)
  • iOSネイティブ機能:
    • 音声認識: Speech Framework
    • 音声合成: AVFoundation (AVSpeechSynthesizer)
    • 写真: PhotoKit
    • バックグラウンド処理: BackgroundTasks

こだわりポイント

  • リテンション率向上のテクニック:「思い出と学習モード」と「みんなの写真モード」はSNSのストーリーや振り返り機能といったユーザのリテンション率を高めるところから着想を得たため,似たような効果が期待できると思われる.
  • iOSアプリにすることにより画像取得までの動線を短縮: ユーザは数タップで自分のアルバムの写真やカメラを学習教材に変換できる.

  • オンデバイスVLMによるプライバシーフレンドリーな学習にも対応: ユーザーはプライバシーと性能のトレードオフを考慮し,クラウドAPIを使わずにデバイス上で完結する学習モードを選択できる.

  • エピソード記憶の活用: 「思い出と学習モード」により,個人の体験と強く結びついた学習を提供し,記憶の定着を促進する.

  • 多様な学習形式: 単語並べ替えからスピーキング,ライティングまで,多角的なアプローチでユーザーを飽きさせず,総合的な言語能力の向上をサポートする.

将来的展望

  • 友達機能の追加 みんなの写真モードについて,友達機能を取り入れないと,赤の他人の写真を見ることになってしまい,課題にそぐわない.よって友達機能を取り入れる予定である.
  • 対応言語の拡充: 現在のアーキテクチャは多言語対応を前提に設計されており,容易に新しい言語を追加できる.
  • オフライン機能の強化: オンデバイスVLMの活用をさらに進め,ネットワーク接続がない環境でもほとんどの機能が利用できる完全なオフライン学習モードの実現を目指す.
  • 学習進捗の可視化: 学習時間,正答率,語彙の成長などをグラフで可視化し,学習者が自身の成長を実感できる機能を追加する.
  • ゲーミフィケーション: エフェクトのリッチ化,SNSに寄せた運用など

  1. Michael H. Long. Second Language Needs Analysis. Cambridge University Press. 2005. DOI: 10.1017/CBO9780511667299.
  2. T B Rogers, N A Kuiper, W S Kirker. Self-reference and the encoding of personal information. J Pers Soc Psychol. 1977 Sep;35(9):677-88. DOI: 10.1037//0022-3514.35.9.677.

急にCursorがリモートサーバに繋がらない

症状

リモートを開いていますでグルグル永遠に接続されない.

ヘルプ→開発者ツールの切り替えで見ると,クライアント側に問題があるみたい.

再現するには

Remote SSHの窓3つくらい建ててると時々こうなる.

解決策

Step 1. サーバ側の .vscode-server / .cursor-server を削除

rm -rf ~/.vscode-server
rm -rf ~/.cursor-server

Step 2. CursorのRemote SSH拡張を一度無効化 → 再有効化

結果

Yay!

ZochiがACLのメイントラックに採用された件

素晴らしい!!一方でなんか、著者がAIじゃない事に違和感を覚えてしまう自分がいました。変なのかな。

まあでも、このAIを作ったのにめっちゃ工数はかかってるから、何かしらの形で功績は出してもいいとは思うが。

 

ここまで来ると分かんないもんですなぁ。

アトムが論文書いて、お茶の水博士がファーストになってたらなんか文句は出てきそうなものなのに

 

f:id:nawtarakan:20250601135536p:image

 

f:id:nawtarakan:20250601135345p:image

 

f:id:nawtarakan:20250601135602j:image

 

チのこのシーンを思い出しましたw