大学でプログラミングを学び、その経験とアウトプットを載せようと思います。
学部1年
プログラミングの基本の if文、for文、配列などの基本を学んだ。一番最初に触れた言語はC言語で教科書の文法の説明と使い方を読み、問題を解く演習の授業があった。中間課題や最終課題では、ランレングス圧縮や逆ポーランド法、各種ソートの説明を読み、実際に実装するようなものだった。コードを書き考えたとうりに動かしたり、問題を解いたり(stackを使って迷路を解く問題など)するのが楽しかった。
飲食店のバイトをしていたので、一週間に休みの日は無くかなり大変だった。
学部2年前期
2年の前期にも、C言語の演習の授業があった。1年の頃とは違い、構造体やポインタ、木構造のDFS(深さ優先探索)やBFS(幅優先探索)、連結リストなどを扱っていた。最終課題では、連結リストで住所のデータを作り、文字一致で検索できるように実装した。文字列などのポインタの扱いがややこしかったような。
英語のPythonの教科書を輪読で発表する授業があった。分からない英単語を調べながら発表スライドを作成して頑張った。それぞれの授業でC言語とPythonを使っていたので文法がこんがらがり、はじめのうちは苦労していたが次第に慣れていった。
学部2年後期
JAVAの演習の授業があった。この授業も問題形式の授業で、JAVAでは主にクラスについて学んだ。クラスのコンストラクタやメソッド、オーバーロード、オーバーライド、アクセス修飾子について学んだ。あと、拡張for文やライブラリなど。最終課題では、ブラックジャックのシステムを仕様書のとおり実装した。プレイヤーやCPU、ディーラー、カードのクラスを作成し、ゲームの進行やカードの分配、ユーザの入力やスコアの自動判定を行える。クラスって便利だなと感じた。
前期に引き続き英語のPythonの授業もあった。最初の方は、前期と同様に輪読で進めていったが、教科書を最後までやりおえると、チームで自由に制作物をつくりあげる課題となった。チームは4人で何を作るかを話し合い、2Dのシューティングゲームを作成した。課題として教科書のコードと標準ライブラリのみ使用可能で、プレイヤーや敵、弾のクラス、衝突判定などの関数を作成した。完成しきれた達成感や投票で順位を決めたときに1位をとれたのがとてもうれしかった。また、他の人に遊んでもらい、楽しんでくれたうれしさもあった。
↓ 作った2Dシューティングゲーム タイトル:DEXTIRUS github の publicリポジトリ
↓ 他の授業でBlenderを使うことがあり、そのときに雪中のログハウスを作った。
学部3年前期
webデザインの授業があり、webのデザインやHTML・CSSについて学んだ。テストでは、ウェブデザイン技能検定の過去問から出題された。最終課題では、テーマを決めて企画書を書きHTML・CSSでwebページを作成した。このころ「ゼロから作るDeep Learning」を読んでいたので、その内容についてのまとめをテーマにした。
↓そのときの企画書
のちにwebページを github Pages で公開した
→ https://daichiyano610.github.io/NNsummary/index.html
ソフトウェア工学の演習の授業では、自由テーマで外部仕様書・内部仕様書・テスト仕様書を作成し、それぞれの仕様書を生徒どうしでレビュー・改善をしていった。仕様書をもとに実装していくうえで、機能ごとにまとまりのある関数に分割することを意識して取り組んだ。テーマは高校時代に部活としてやっていた「将棋」をC言語の「ncurses」というTUIのライブラリを用いて実装した。授業時間だけで終わらいない気がしたので空いた時間コツコツとやっていた。
↓ 作った将棋の実行画面 github の publicリポジトリ
情報メディア演習の授業では、Pythonで言語処理を用いたwebアプリケーションと画像処理を用いたシステム開発を行った。言語処理では、CSVファイルでのデータの読み取りや正規表現を用いた文字一致判定、Flaskを用いたwebサーバの作成について学んだ。テーマとして「将棋の遊び方紹介システム」を作成した。それぞれの駒の動かし方や将棋のルールについて教えてくれる。
↓ 将棋の遊び方紹介システム
画像処理のシステム開発では、Pythonの Numpy(数値計算) や OpenCV(画像処理)、MediaPipe(機械学習)などのライブラリについて触れた。物体抽出の背景差分や物体の動きを抽出するオプティカルフロー、画像分類(グー、チョキ、パーの分類)について学んだ。MediaPipeでは、手の骨格検出と全身の骨格検出が可能だ。制作物として、手の骨格検出を用いたホッケーゲームを作成した。ボールを手の人差し指で跳ね返し、画面の左右の端をゴールとして遊べるゲームとした。ボールのクラスを作成し、座標や速度の変数を持たせ、ボールと手の衝突判定や跳ね返りの計算などを実装した。
↓ 手の骨格検出のホッケーゲーム
3年の前期には配属する研究室を決める時期で、AIについて学びたかったので自然言語処理研究室に入った。この研究室の院生の方に誘われ、3人一組で参加するICPC(国際大学対抗プログラミングコンテスト)に出場した。オンラインの予選で上位のチームのみが本選に出場することができるルールで、本選には出場できなかったが、自分が担当した問題を解くことができて良かった。この経験から、コードの計算量について意識するようになった。また、競技プログラミング(AtCoder)を取り組むようにもなった。
学部3年<夏>
ゼロから作るDeep Learningを読み終えた。パーセプトロンからニューラルネットワーク、誤差逆伝播法、勾配降下法などについて学んだ。しかし、AI関連の知識が足らないと感じ調べたところ「G検定」について知った。G検定では、 AI・ディープラーニングについて体系的に学ぶことができると思い、G検定の公式テキストを読み始めた。AIについての歴史や仕組み、社会実装について学ぶことができた。のちにG検定の問題集を3周し、知識の確認のため11月ごろにある資格試験を受験し合格した。
情報科学技術で地域の社会課題を解決するボランティア活動に参加した。いくつかのテーマがあるなかから、「市の文化財をもっと多くの人に知ってもらいたい」という課題に取り組んだ。文化財は市内の歴史ある寺や跡地で、その歴史について小学生でも楽しめるようにしたいとのことでした。チームメンバーは6人で、実際に寺や跡地を訪れアイデアを出し合い、Scratch で文化財の歴史を交えたゲームを制作した。文化財の歴史をゲームを通して学べるとともに、プログラミングに触れることができるというアイデアで決まった。役割分担をして、無事に最後まで作り終えることができた。そのときには、達成感とチームメンバーとの仲が深まり、打ち上げで食べた赤から鍋が美味しかった。
「ちゅらデータ」さんの夏のインターンに参加させてもらった。対面形式の予定だったが台風の影響でオンラインでの開催となってしまった。インターンでは、「RAG (Retrieval Augmented Generation) 技術を活用し、ChatGPTを用いた高性能な検索アプリケーション開発。AWSとSnowflake で作るクラウドネイティブデータ基盤構築」について学ばせてもらった。RAGの解説やAPIを使用した独自のアプリケーション開発、AWS S3 や Snowflake 、 Terraform での構築について知ることができた。分からないことを質問すると社員さんの方が丁寧に教えてくださったり、実際に現役のエンジニアの方と話す良い機会となった。
学部3年後期
研究室活動について。大学の文化祭のようなイベントで研究室の展示するため、3年生の研究室の同期でデモを作成した。メンバーでアイデアを出し合い、OpenAIのgptのAPIを使用した言い訳作成webアプリケーションを作成した。webサーバはPythonのFlaskを使い、HTML/CSS/JavaScriptを使用した。自分の役割としては進行役を務めて、アイデアだしの次に、Pythonのチーム、HTML/CSS/JavaScriptのチーム、プロンプトのチームの分け、それぞれのチームにやって欲しいことを伝えた。ここでの自分の仕事として、「全体の進捗の把握」「PythonのwebAPIとJavaScriptの連携」を行った。このときにサーバへのリクエスト(GETやPOST)について学んだ。制作期間は1ヶ月ほどのもので、なんとか完成することができた。展示したときには、子供から大人まで楽しんでもらえたのがうれしかった。デモ作成を終えると、BERTによる自然言語処理入門を輪読で進めていった。ネガポジ判定やテキスト分類、fill-maskなどを扱った。
授業では、3Dモデルのエージェントを使ったインタラクティブなシステム開発と地域のPR動画の作成をした。授業では、既存の3Dモデルをコードで動作させる方法を学んだのちに、グループメンバーでアイデアを出し合い開発を進めた。アイデアとして、絵柄のポーカーゲームを作ることに決まった。役割分担では、主に「3Dモデルのアニメーション作成」「3Dモデルの操作コード」「ゲームのシステム」「素材集め」のグループに分けた。自分はポーカーのゲームのシステム(Python)を担当した。カードの配布や交換、役やスコアの自動計算を1つのクラスにして作成した。そして、それぞれのものをつなぎ合わせ1つのシステムとして動いたときは達成感があった。授業の投票で2位をとれたのも良かった。他の授業では、ソケット通信を使ったお絵描きサーバクライアントシステムについて学んだ。言語はC++で、OpenCVを用いていた。
サポーターズが開催している技育キャンプハッカソン(オンライン)に参加した。ハッカソンには初めての参加だった。ハッカソンの目標として「挑戦」することを意識して、gitをはじめて触れた。制作物としてはコーヒーのドリップタイマーを作成した。PythonのFlaskとGunicornを使用して、Renderで実行している。
制作物のURL: https://baristimer.onrender.com/
※Renderは一定時間以上アクセスがないとサーバがスリープ状態になるため、アクセスしてから表示されるまで時間がかかります。
学部4年<春>
機械学習について学ぼうと思い、東京大学のデータサイエンス育成講座を読んだ。Pythonのscikit-learnを用いた分類や回帰の手法について学んだ。重回帰やロジスティック回帰、ランダムフォレスト、サポートベクタマシンなどをデータセットを用いて、学習を行った。
学部4年前期
大学院に進学することが決まっていて,大学院の先取り授業を受講していた。知識ネットワークの授業ではレコメンデーションや擬似アニーリング法、遺伝的アルゴリズム、ランダムサーチ、クラスタリングなどについて学んだ。データを扱って最適な組み合わせや予測を行うのが面白かった。
東京大学の岩澤・松尾研究室が無料でやっているDeepLearning基礎講座を受講した。基礎のパーセプトロンからニューラルネットワーク、CNN、RNNなどについての講義と演習があった。演習では、Pytorchを使用した実装がされており、穴埋め形式でコードを入力し、学習や推論を行った。提出したコードをもとに、受講者の中でモデル精度を競うリーダーボードが見られるようにもなっていて、面白かった。また、課題で講義の内容の4択クイズが出題されており,理解できているかの復習ができるようになっていた。
去年と同様に、ICPC(国際大学対抗プログラミングコンテスト)に出場した。去年とは違ったメンバーでの出場だった。解けた問題は3問ほどで、4問目からは難しかった。このころに空いた時間でAtCoderもやっていて(茶色)にようやくなることができた。二分探索やDP(動的計画法)などのアルゴリズムについて知る良い機会だった。実際に、問題を読み、どのアルゴリズムを使用するかといったところが課題だと感じる。
研究では、LLM関連の研究をしようと思い論文のサーベイを行っていた。そもそもLLMの仕組みについて知らなかったので、調べると「Attention is all you need」という論文でtransformerが基礎となっていた。そこから、LLMのハルシネーションやプロンプトエンジニアリング、ファインチューニング、RAGといった研究内容に触れていった。また、研究室のPCにSSHでの接続やgitlab、環境構築のDockerについて学んだ。
学部4年夏
医療関係の仕事をしている友人がおり、認知症患者のリハビリとして塗り絵を行う業務がある。塗り絵は子供向けのものは多くあるが、大人向けのものは少く、患者の塗り絵の要望を聞き、手書きで描いているため手間がかかっている。そこで,好きな画像を線画に変換するソフトウェアを開発し、実際に使用してもらった。Pythonで実装しており、GUIはTkinter、画像処理はPillowとOpenCV、実行可能ファイル化にはPyinsterlerを使用した。
↓作成したソフトウェア githubのpublic リポジトリ
研究では、HuggingFaceの使い方と自動車運転免許試験の問題集のデータセットを参照して、LLMに回答と回答理由の生成と正答率の自動計算などの実装を行った。研究室のPCで動作可能なLLMのパラメータサイズが10B程度なので、10B以下のモデルを6つほど探し使用した。また、大学の研究室の展示において、自分の研究で使用するLLMを種類や8bit量子化の有無を切り替えてチャットできるwebアプリを作成した。
↓ LLMを切り替えてチャットできる
学部4年後期
前期に引き続き、岩澤・松尾研究室の大規模言語モデル講座を受講した。この講座では主に、LLM関連の研究動向について知ることができた。pre-trainedやincontext-learning、RAG、RLHFなどの論文を引用として説明されていた。その中でも面白いと感じたのは、モデルの内部パラメータがどのような情報を保持しているかといったprobingについてだった。最近では、Sparse autoencorder を用いた手法がよく用いられており、LLMがどの単語によく反応するかといった研究がされていた。
NLP2025で、「軽量 LLM を用いた規則適合判定」のポスター発表を行った。









