スライド資料
本日の講義では、まず人工知能(AI)、機械学習(ML)、深層学習(DL)、および生成AI(GenAI)の定義とそれぞれの特徴について解説します。その後、Teachable Machineを使った機械学習の基本的な体験を通じて、実際にモデルを訓練し、画像分類を行う流れを体感してもらいます。特に転移学習の仕組みと少数のデータで高精度な判別が可能となる理由についても触れます。最後に、生成AIの本質であるTransformerモデルに焦点を当て、次回へとつなげます。
本日の内容
- 前回の課題の解説
- 人工知能、機械学習、深層学習、生成AI、それぞれの定義と意味
- GPTとは?
- 機械学習について理解する
- Teachable Machineで機械学習体験!
- 生成AIの本質に迫る: Transformerについて
- ニューラルコンピューティングからGPTへと至る30年の歴史
生成AIの基本用語を理解する
- 4つの用語の定義
- 人工知能 (Artificial Intelligence, AI)
- 機械学習 (Machine Learnig, ML)
- 深層学習 (Deep Learning, DL)
- 生成AI (Generative AI, GenAI)
- GPTについて
- GPTとは?
- 「G」「T」「P」の意味
「人工知能」「機械学習」「深層学習」「生成AI」それぞれの定義と意味
映像を視聴
Introduction to Generative AI
ポイント:
- AI、ML、DL、Gen AIの定義
- 学習について (教師あり学習、教師なし学習)
- 深層学習、ディープニューラルネットワークについて
- 生成AIは深層学習の一部
- 生成モデルと識別モデル
- 大規模言語モデル: PaLM、LaMDAなど
- Transformerモデルの重要性
- Text-to-Text、Text-to-Image、Text-to-Videoなどの様々な生成AIモデル
参考: ホモ・コーデンスYCAMワークショップ資料
生成AIの明暗 – データセットが孕む問題
2つの映像資料を視聴。
How This Guy Uses A.I. to Create Art | Obsessed | WIRED
AI Art: How artists are using and confronting machine learning | HOW TO SEE LIKE A MACHINE
参考資料
Refik Anadole, Unsupervised — Machine Hallucinations — MoMA (2023)
KATE Crawfordt, Trevor Paglen, Training Humans
Trevor Paglen, Behold these Glorious Times! (2020)
Kate Crawford, Vladan Joler, Anatomy of an AI System (2018)
Kate Crawford, Vladan Joler, Calculating Empires: A Genealogy of Power and Technology, 1500-2025
ポイント
- 生成AIの技術はとても強力で新たな表現を生みだす可能性に満ちている
- しかし、その背後には様々な問題も存在する
- データの偏り
- 巨大企業による独占
- 大量なエネルギーの消費
- プライバシーの問題
- 著作権侵害のリスク
- フェイクニュース
- AIのブラックボックス化
- …etc.
- 生成AIを完全に拒否するわけではない
- しかし無批判に全て受け入れるのでもない
- 生成AIの利便性を享受しつつ、その問題や構造について批判的に考えていきたい
- そのためには、生成AIの技術について正確なイメージを持つ必要 (!= 魔法)
Teachable Machineで機械学習体験

Teachable Machine
- 本格的な生成AIについて考えていく前段階として、機械学習の基本を学ぶ
- 教師あり学習 (転移学習) の基本の流れを体験
- 画像読み込み → ラベル付け → 学習 → クラス分け (判別)
- 様々な画像で試しながら実感してみる!
実習: Teachable Machineで機械学習
まずは学習を試してみる
- Teachable Machineで新規のImageプロジェクトを作成
- 数種類 (クラス) の画像セットをWebカメラで撮影
- 「Train Model」ボタンで学習開始
- Previewで確認、いまいちな場合は画像の撮影からやり直し
最初は「Image Project」が簡単なのでおすすめです。どのような画像のセットを学習させると面白いか考えながらいろいろ試してみましょう!
学習モデルを書き出す
Teachable Machineでは学習させたモデルを書き出してプログラムで利用することが可能です。様々な開発環境に対応して、サンプルのソースコードの生成まで簡単に行うことが可能です。
対応している環境
- Tensorflow
- Tensorflow Lite
- Tensorflow.js
- p5.js + ml5.js ← 今回はこちらを使用
学習モデルの書き出し手順
- Teachable Machineで新規のImageプロジェクトを作成
- 数種類 (クラス) の画像セットをWebカメラで撮影
- 「Train Model」ボタンで学習開始
- Previewで確認、いまいちな場合は画像の撮影からやり直し
- 問題無ければ「Export Model」ボタンを押す
- Tensorflow.js > Upload (shareable linke) > p5.jsを選択して「Upload my model」ボタンを押す
書き出し設定
学習させたモデルをp5.jsに読み込む
学習してアップロードしたモデルのURLを適用
... (前略) ...
// 学習してアップロードしたモデルのURL
// !!ここに自分のモデルのURLを入力!!
let imageModelURL = 'https://teachablemachine.withgoogle.com/models/8dyZwOgL4/';
... (後略)...
実行結果
ポイント! サンプルコードのどこで分類を行っているのかを読み解く
重要なのは、下記の関数
// 現在のビデオフレームを分類する
function classifyVideo() {
classifier.classify(flippedVideo, gotResult);
}
// 結果が得られたとき
function gotResult(results) {
// 結果は信頼度順に配列に格納される
// console.log(results[0]);
label = results[0].label;
}
重要なのは、results[]
配列
- 画像を解析してその確度 (そのクラスである確率) が高い順番に配列に格納されている
- ラベル名 (label) と確度 (confidence) が取得できる
- 例えば一番確度の高い結果のラベルとその確度を取得するには
let label = result[0].label; //ラベル
let confidence = result[0].confidence; //確度
分類結果のラベル (文字列) と信頼度 (0.0 – 1.0 の値)の一覧を表示
分類結果のラベル (文字列) と信頼度 (0.0 – 1.0 の値)の一覧を表示するサンプル
実行結果
Emoji Cam
ちょっと工夫してみる。表情によって絵文字を表示するカメラのサンプル。この例では、普通の顔 (normal)、笑顔 (smile) 、悲しい顔 (sad) の3種類を学習してみました。
実行結果
なぜ少数の画像で判別できるのか?
- 画像のクラス分け (Image classification)
- 本来であれば膨大な学習データが必要
- 画像 + ラベルのセット
大規模な画像データベースの例: ImageNet
ImageNet
- 物体認識の研究で用いるために設計された大規模な画像データベース
- 2024年10月現在、14,197,122個の画像を学習
転移学習 Transfer Learning
- Teachable Machineが少数の画像で学習できる原理
- あるタスクで学習したモデルを、関連する新しいタスクに適用させる手法
- ゼロからネットワークを学習させるよりも高速で簡単
- 学習にかかる時間を短縮できる
- 学習対象となるサンプルデータの不足を補うことができる
転移学習はどのように動作しているのか
実習: Image Projectで遊んでみる!
- Teachable MachineのImage Projectで遊んでみましょう
- どのような判別をさせてみたら面白いことができそうか?
- 画像を学習させてみる
- イラストを描いて判別させてみる
- ジェスチャーを学習させてみる
..etc.
転移学習と大規模言語モデル(LLM)
大規模言語モデル(LLM)とは?
- 大量のテキストデータで事前学習された言語モデル (GPT、Geminiなど)
- とてつもない量のデータが事前学習されている
LLM: 人間が一生で読むテキスト量を遥かに超える
- GPT-5(推計): 約114兆トークン
- 1トークン = 約4文字とすると、約456兆文字
- 人間: 一生に平均2,000冊の本を読むという推計があり
- 1冊の本を平均300ページ、1ページを平均500文字とすると
- 1冊あたり15万文字
- 一生の読書量 = 2,000冊 × 15万文字/冊 = 3億文字
- 456兆文字 ÷ 3億文字 = 約152万倍!!
転移学習とファインチューニング
- なぜ大規模言語モデル(LLM)は少数のプロンプトで高精度な応答が可能なのか?
- LLMの巨大な事前学習モデル
- この巨大な事前学習モデルをベースにして、特定のタスクに合わせて微調整
- つまり、転移学習の仕組みの応用 → ファインチューニング (Fine-tuning)
転移学習(左)とファインチューニング(右)
事前学習 (Pre-training) と微調整 (Fine-tuning)
- 事前学習: 大量のテキストデータで一般的な言語パターンを学習
- 微調整: 特定のタスクやドメインに合わせてモデルを調整
- 転移学習 (Transfer Learning)
- 事前学習で得た知識を新しいタスクに適用
- 少数のプロンプトで高精度な応答が可能に
次回予告 – 生成AIの本質に迫る
GPTとは? GPTに至る歴史
次回はいよいよGPTについて迫っていきます! 事前に予習したい方は以下のビデオを視聴してみてください。
ChatGPT: 30 Year History | How AI Learned to Talk
アンケート
本日の講義に参加した方は、以下のアンケートに回答してください。
アンケート
この講義では、p5.jsを使用してコードによるデザインを行います。その最初の一歩として、コードによって「かたち」を描くにはどうすれば良いのか考えていきます。
まず始めに、1950年代〜70年代の、コンピューター黎明期から発展期におけるコード(プログラム)による様々な視覚表現について紹介します。過去の作家がどのようなアイデアで、何を表現しようとしてきたのか、その歴史を辿ります。
後半は、そうした歴史を踏まえた上で、 p5.jsで実際に図形を描いていきます。まずp5.jsの操作基本を解説し、簡単な図形を描きながらp5.jsでのプログラミングの基本を学びます。
スライド資料
本日の課題
テーマ: 「p5.js基本図形と色による画面構成」
ここまで解説したp5.jsの機能を活用して画面構成をしてみましょう! 座標、色、数値による図形の描画に慣れるのが目的です。 次回の授業の冒頭で優秀作品を紹介していきます。
ランキング (2024)
課題提出 + アンケート
課題の提出は以下のアンケートフォームから。
アンケートフォーム
(※提出者の確認は学籍番号をキーにしています。間違いが無いかよく確認してください。)
スライド資料
前回の「最初の音」に引き続き、Strudelの初歩を学んでいきます。今回は、前回のサンプリングされた音でリズムを作成する方法から発展させて、音程のあるノートを使用したメロディや和音の作成に挑戦します。音符を数字や文字で演奏する方法、異なるサウンドを組み合わせる技術、長いシーケンスの再生方法、さまざまな音階の使い方を説明しています。また、繰り返しや音の長さの変更、パターンの自動化に関する技術も取り上げ、複数のパターンを同時に演奏することも可能です。
本日の資料もStrudelのチュートリアルを使用しています。元の資料は以下にあります。
数字と音符
数字を使って音符を演奏する
note("48 52 55 59").sound("piano")
- いろいろな数字を試してみましょう!
- 55.5のような小数を試してみましょう
文字で音符を演奏する
note("c e g b").sound("piano")
- さまざまな文字 (a – g) を試してください。
- 実際に言葉になっているメロディーを見つけられますか?
黒鍵を演奏するためにフラットまたはシャープを追加します
note("db eb gb ab bb").sound("piano")
note("c# d# f# g# a#").sound("piano")
異なるオクターブの文字で音符を演奏する
note("c2 e3 g4 b5").sound("piano")
音符のアルファベット表記に慣れていない場合は、数字を使う方が簡単です。そのため、以下の例のほとんどでは数字を使用しています。正しい音符を演奏しやすくする方法については、後ほど説明します。
音を変える
無音程音の場合と同様に、次のようにして音符の音を変更できます
note("36 43, 52 59 62 64").sound("piano")
さまざまなサウンドを試してみましょう。
- gm_electric_guitar_muted
- gm_acoustic_bass
- gm_voice_oohs
- gm_blown_bottle
- sawtooth
- square
- triangle
- bd、sd、hhはどうですか?
- .sound(“…”) を除去すると?
音を切り替える
note("48 67 63 [62, 58]")
.sound("piano gm_electric_guitar_muted")
複数のサウンドを重ねる
note("48 67 63 [62, 58]")
.sound("piano, gm_electric_guitar_muted")
- noteとsoundのパターンが組み合わされています。
- パターンを組み合わせる方法については後ほど詳しく説明します。
より長いシーケンス
シーケンスを分割して/速度を落とす
note("[36 34 41 39]/4").sound("gm_acoustic_bass")
- /4括弧内のシーケンスを 4 サイクル (=8 秒) にわたって再生します。
- したがって、4 つの音符はそれぞれ 2 秒の長さになります。
- 括弧内にさらに音符を追加してみて、速度が速くなるかどうかを確認する。\
1サイクルごとに1つプレイ< … >
前のセクションでは、< … >(山括弧) を使用してサイクルごとに 1 つだけを再生できることを学びました。これは、より長いメロディーにも役立ちます。
note("<36 34 41 39>").sound("gm_acoustic_bass")
括弧内にさらに音符を追加してみて、テンポが同じままであることに注目してください。
- 山括弧は実際には単なるショートカットです。
- <a b c> = [a b c]/3
- <a b c d> = [a b c d]/4
1サイクルごとに1つのシーケンスを再生する
2種類の括弧は様々な方法で組み合わせることができます。
以下は反復的なベースラインの例です。
note("<[36 48]*4 [34 46]*4 [41 53]*4 [39 51]*4>")
.sound("gm_acoustic_bass")
複数のことを交互に行う
note("60 <63 62 65 63>")
.sound("gm_xylophone")
これは音程のない音にも役立ちます:
sound("bd*4, [~ <sd cp>]*2, [~ hh]*4")
.bank("RolandTR909")
スケール
正しい音符を見つけるのは難しい場合があります。スケールが役立ちます。
setcpm(60)
n("0 2 4 <[6,8] [7,9]>")
.scale("C:minor").sound("piano")
いろいろな数字を試してみてください。どの数字でも良い響きになるはずです!
さまざまなスケールを試してみましょう。
- C:major
- A2:minor
- D:dorian
- G:mixolydian
- A2:minor:pentatonic
- F:major:pentatonic
スケールを自動化する
他のものと同様に、パターンを使用してスケールを自動化できます。
setcpm(60)
n("<0 -3>, 2 4 <[6,8] [7,9]>")
.scale("<C:major D:mixolydian>/4")
.sound("piano")
これらのスケールの意味が分からなくても心配はいりません。これらは、相性の良い異なる音符の組み合わせを表すラベルです。
ゆっくり時間をかけて、お好みのスケールを見つけてください。
繰り返して伸ばす
@で延長
note("c@3 eb").sound("gm_acoustic_bass")
@を使用しないのは@1を使用するのと同じです。上記の例では、cは3単位の長さで、ebは1単位の長さです。
番号を変えてみて下さい!
サブシーケンス内で伸長する
setcpm(60)
n("<[4@2 4] [5@2 5] [6@2 6] [5@2 5]>*2")
.scale("<C2:mixolydian F2:mixolydian>/4")
.sound("gm_acoustic_bass")
このグルーヴは shuffleと呼ばれます。各ビートには2つの音符があり、最初の音符は2番目の音符の2倍の長さになります。これはトリプレット・スウィングと呼ばれることもあります。ブルースやジャズでよく見られます。
複製する
setcpm(60)
note("c!2 [eb,<g a bb a>]").sound("piano")
- !と*と@を切り替えてみてください
- 違いは何ですか?
サンプルプログラム
上品なベースライン
note("<[c2 c3]*4 [bb1 bb2]*4 [f2 f3]*4 [eb2 eb3]*4>")
.sound("gm_synth_bass_1")
.lpf(800)
上品なメロディー
note(`<
[~ 0] 2 [0 2] [~ 2]
[~ 0] 1 [0 1] [~ 1]
[~ 0] 3 [0 3] [~ 3]
[~ 0] 2 [0 2] [~ 2]
>*4`).scale("C4:minor")
.sound("gm_synth_strings_1")
上品なドラム
sound("bd*4, [~ <sd cp>]*2, [~ hh]*4")
.bank("RolandTR909")
上記のすべてを同時にプレイする方法があったら…
できます!! $: で!
複数のパターンを演奏する
複数のパターンを同時に再生したい場合は、各パターンの前に「$:」を記述する。
$: note("<[c2 c3]*4 [bb1 bb2]*4 [f2 f3]*4 [eb2 eb3]*4>")
.sound("gm_synth_bass_1").lpf(800)
$: n(`<
[~ 0] 2 [0 2] [~ 2]
[~ 0] 1 [0 1] [~ 1]
[~ 0] 3 [0 3] [~ 3]
[~ 0] 2 [0 2] [~ 2]
>*4`).scale("C4:minor")
.sound("gm_synth_strings_1")
$: sound("bd*4, [~ <sd cp>]*2, [~ hh]*4")
.bank("RolandTR909")
いよいよ本物の音楽のような音になってきました!音と音符は揃いましたが、あとはエフェクトというパズルの最後のピースが残っています。
アンケート
本日の講義に参加した方は、以下のアンケートに回答してください。
アンケート
今回からいよいよopenFrameworksによるプログラミングを開始していきます。
openFrameworksではProcessingやp5.jsのように新規ファイルを生成するだけではプログラムは開始できません。様々なファイルや設定を内包したプロジェクトを生成する必要があります。まず初めに新規のプロジェクトの生成の方法について説明します。
次に、openFrameworksでまず差し当って編集していく、main.cpp、ofApp.h、ofApp.cppという3つのファイルについて解説します。また、ofAppの中にある3つの重要な関数、setup()、update()、draw()の役割についても説明していきます。
後半はいよいよプログラミングしていきます。今回は物体が直線運動する簡単なアニメーションを完成させるところまでを目標とします。
スライド資料
課題提出 + アンケート
本日の授業を受講した方は、以下のフォームに回答してください。
課題提出+アンケート