<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>機械学習 - まったり勉強ノート</title>
	<atom:link href="https://www.mattari-benkyo-note.com/tag/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.mattari-benkyo-note.com</link>
	<description>shuの日々の勉強まとめ</description>
	<lastBuildDate>Sun, 24 Aug 2025 23:09:07 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>
<site xmlns="com-wordpress:feed-additions:1">189243286</site>	<item>
		<title>[書評] 原論文から解き明かす生成AI ー 話題のAIを深く理解したいと思ったら読む一冊</title>
		<link>https://www.mattari-benkyo-note.com/2025/08/25/generative_ai_paper_book_review/</link>
					<comments>https://www.mattari-benkyo-note.com/2025/08/25/generative_ai_paper_book_review/#respond</comments>
		
		<dc:creator><![CDATA[Shuji Suzuki (shu)]]></dc:creator>
		<pubDate>Sun, 24 Aug 2025 23:09:06 +0000</pubDate>
				<category><![CDATA[書評]]></category>
		<category><![CDATA[拡散モデル]]></category>
		<category><![CDATA[書籍]]></category>
		<category><![CDATA[機械学習]]></category>
		<category><![CDATA[生成AI]]></category>
		<guid isPermaLink="false">https://www.mattari-benkyo-note.com/?p=3294</guid>

					<description><![CDATA[<p>今回は「原論文から解き明かす生成AI」という生成AIに関する技術を重要な論文を深く解説している本を献本でいただいたので、紹介します。 どんな内容の本か？ ChatGPTをはじめとしたいろいろな生成AIが出てきている中、ど [&#8230;]</p>
<p>The post <a href="https://www.mattari-benkyo-note.com/2025/08/25/generative_ai_paper_book_review/">[書評] 原論文から解き明かす生成AI ー 話題のAIを深く理解したいと思ったら読む一冊</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>今回は「<a href="https://amzn.to/45PjIVY" target="_blank" rel="noopener" title="原論文から解き明かす生成AI">原論文から解き明かす生成AI</a>」という生成AIに関する技術を重要な論文を深く解説している本を献本でいただいたので、紹介します。</p>


		<div class="pochipp-box"
			data-id="3295"
			data-img="l"
			data-lyt-pc="dflt"
			data-lyt-mb="vrtcl"
			data-btn-style="dflt"
			data-btn-radius="on"
			data-sale-effect="none"
			 data-cvkey="dbab8890"		>
							<div class="pochipp-box__image">
					<a href="https://www.amazon.co.jp/dp/B0FJLL7D1L?tag=shu65-22&#038;linkCode=ogi&#038;th=1&#038;psc=1" rel="nofollow noopener" target="_blank">
						<img decoding="async" src="https://m.media-amazon.com/images/I/51szxgSUKhL._SL500_.jpg" alt="" width="120" height="120" />					</a>
				</div>
						<div class="pochipp-box__body">
				<div class="pochipp-box__title">
					<a href="https://www.amazon.co.jp/dp/B0FJLL7D1L?tag=shu65-22&#038;linkCode=ogi&#038;th=1&#038;psc=1" rel="nofollow noopener" target="_blank">
						原論文から解き明かす生成AI					</a>
				</div>

									<div class="pochipp-box__info">著:菊田 遥平</div>
				
				
							</div>
				<div class="pochipp-box__btns"
		data-maxclmn-pc="fit"
		data-maxclmn-mb="1"
	>
					<div class="pochipp-box__btnwrap -amazon">
								<a href="https://www.amazon.co.jp/dp/B0FJLL7D1L?tag=shu65-22&#038;linkCode=ogi&#038;th=1&#038;psc=1" class="pochipp-box__btn" rel="nofollow noopener" target="_blank">
					<span>
						Amazon					</span>
									</a>
			</div>
							<div class="pochipp-box__btnwrap -rakuten">
								<a href="https://hb.afl.rakuten.co.jp/hgc/39c5c75e.b3799909.39c5c75f.e5fd5e7d/?pc=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2F%25E5%258E%259F%25E8%25AB%2596%25E6%2596%2587%25E3%2581%258B%25E3%2582%2589%25E8%25A7%25A3%25E3%2581%258D%25E6%2598%258E%25E3%2581%258B%25E3%2581%2599%25E7%2594%259F%25E6%2588%2590AI&#038;m=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2F%25E5%258E%259F%25E8%25AB%2596%25E6%2596%2587%25E3%2581%258B%25E3%2582%2589%25E8%25A7%25A3%25E3%2581%258D%25E6%2598%258E%25E3%2581%258B%25E3%2581%2599%25E7%2594%259F%25E6%2588%2590AI" class="pochipp-box__btn" rel="nofollow noopener" target="_blank">
					<span>
						楽天市場					</span>
									</a>
			</div>
											</div>
								<div class="pochipp-box__logo">
					<img decoding="async" src="https://www.mattari-benkyo-note.com/wp-content/plugins/pochipp/assets/img/pochipp-logo-t1.png" alt="" width="32" height="32">
					<span>ポチップ</span>
				</div>
					</div>
	


<h2 class="wp-block-heading">どんな内容の本か？</h2>



<p>ChatGPTをはじめとしたいろいろな生成AIが出てきている中、どのような仕組みで動いているか？をみなさんどの程度理解しているでしょうか？<br>私自身、生成AIはいろいろな要素が組み合わさっているため、1つ１つは知っているけど、全部を網羅的に理解するというのはかなり難しいと感じています。しかも、発展のスピードが速く関連論文が毎日のように数十本公開されたりしています。<br>このような現状を受けて、この本では重要な原論文をベースに生成AIの基礎を紹介し、かつ、論文を独力で読み解く技術を解説し、自分で論文を読む際の役に立つ技術を紹介している本になります。<br>生成AIといってもいろいろありますが、この本ではChatGPTをはじめとするテキストを中心に画像生成にも触れられている本になっています。<br>このため、テキストと画像に関する基礎部分は大体抑えられる印象です。</p>



<h2 class="wp-block-heading">どんな人にお勧めか？</h2>



<p>以下のような人にお勧めな本かと思っています。</p>



<ol class="wp-block-list">
<li>生成AIを勉強したいけど何から手を出したらいいかわかってない人</li>



<li>論文の読み方について他の人がどうやっているかを知りたい人</li>
</ol>



<p>各論文の解説記事はいろいろwebに公開されている一方、資料がバラバラなのと、生成AIの知識が浅い人にとってはどの論文が重要なのか調べるのも大変な印象です。このため、重要な論文だけに焦点を当ててくれているこの本をまず読むのは最初の手としては良いと感じました。<br>また、論文の読み方は研究室などで他の人のやり方をたまに聞く程度で、他の人がどのように読んでいるかを知る機会はそれほど多くないと思っています。<br>この本では最初に１章かけてこの論文の読み方を解説していて、私のように他の人がどう読んでいるかを知る機会がなかった人には良い参考情報になるのではないかと思っています。</p>



<h2 class="wp-block-heading">個人的に良かった点</h2>



<p>個人的には以下の点が良かったです。</p>



<ol class="wp-block-list">
<li>他の人の論文の読み方を知ることができた</li>



<li>生成AIで抜けていた技術について知ることができた</li>
</ol>



<p>1は先ほどお勧めの人で書いた通り、この本では論文の読み方を１章かけて紹介しており、他の人がどう読んでいるか知る機会がなかった自分にとっては非常に有用でした。<br>また、これに加えて、生成AIは要素が本当にいろいろあり、私自身、さらっとしか知らなかった部分がいくつかあるのですが、その部分についても深く知ることができてよい機会になりました。</p>



<h2 class="wp-block-heading">終わりに</h2>



<p>今回は献本でいただいた「<a href="https://amzn.to/45PjIVY" target="_blank" rel="noopener" title="原論文から解き明かす生成AI">原論文から解き明かす生成AI</a>」の紹介記事でした。生成AIに関する本はいろいろありますが、深く理解したいと思っている人には非常に良い本だと感じました。<br>定期的にこのように本の紹介記事を書いてます。もし興味があれば他の本の記事も見ていただければ幸いです。</p><p>The post <a href="https://www.mattari-benkyo-note.com/2025/08/25/generative_ai_paper_book_review/">[書評] 原論文から解き明かす生成AI ー 話題のAIを深く理解したいと思ったら読む一冊</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.mattari-benkyo-note.com/2025/08/25/generative_ai_paper_book_review/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3294</post-id>	</item>
		<item>
		<title>[書評] 改訂独習Pythonバイオ情報解析 ー バイオのテーブルデータ解析することになったら読む一冊</title>
		<link>https://www.mattari-benkyo-note.com/2025/04/07/python_bioinfo_book_review/</link>
					<comments>https://www.mattari-benkyo-note.com/2025/04/07/python_bioinfo_book_review/#respond</comments>
		
		<dc:creator><![CDATA[Shuji Suzuki (shu)]]></dc:creator>
		<pubDate>Sun, 06 Apr 2025 23:30:00 +0000</pubDate>
				<category><![CDATA[書評]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[バイオインフォマティクス]]></category>
		<category><![CDATA[書籍]]></category>
		<category><![CDATA[機械学習]]></category>
		<guid isPermaLink="false">https://www.mattari-benkyo-note.com/?p=3273</guid>

					<description><![CDATA[<p>今回は「独習Pythonバイオ情報解析」の改訂版「改訂独習Pythonバイオ情報解析」が出たということで読んだので、その紹介になります。 どんな内容の本か？ 年度が変わり、新しい研究室に入ったり、就職した方で「このバイオ [&#8230;]</p>
<p>The post <a href="https://www.mattari-benkyo-note.com/2025/04/07/python_bioinfo_book_review/">[書評] 改訂独習Pythonバイオ情報解析 ー バイオのテーブルデータ解析することになったら読む一冊</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>今回は「独習Pythonバイオ情報解析」の改訂版「<a href="https://amzn.to/42k4Ltm" title="改訂独習Pythonバイオ情報解析">改訂独習Pythonバイオ情報解析</a>」が出たということで読んだので、その紹介になります。</p>


		<div class="pochipp-box"
			data-id="3272"
			data-img="l"
			data-lyt-pc="dflt"
			data-lyt-mb="vrtcl"
			data-btn-style="dflt"
			data-btn-radius="on"
			data-sale-effect="none"
			 data-cvkey="8c0321e1"		>
							<div class="pochipp-box__image">
					<a href="https://www.amazon.co.jp/dp/B0DVKXYBB9?tag=shu65-22&#038;linkCode=ogi&#038;th=1&#038;psc=1" rel="nofollow noopener" target="_blank">
						<img decoding="async" src="https://m.media-amazon.com/images/I/51silEjU90L._SL500_.jpg" alt="" width="120" height="120" />					</a>
				</div>
						<div class="pochipp-box__body">
				<div class="pochipp-box__title">
					<a href="https://www.amazon.co.jp/dp/B0DVKXYBB9?tag=shu65-22&#038;linkCode=ogi&#038;th=1&#038;psc=1" rel="nofollow noopener" target="_blank">
						改訂 独習Pythonバイオ情報解析　生成AI時代に活きるJupyter、NumPy、pandas、Matplotlib、Scanpyの基礎を身につけ、シングルセル、RNA-Seqデータ解析を自分の手で					</a>
				</div>

									<div class="pochipp-box__info">著:先進ゲノム解析研究推進プラットフォーム</div>
				
				
							</div>
				<div class="pochipp-box__btns"
		data-maxclmn-pc="fit"
		data-maxclmn-mb="1"
	>
					<div class="pochipp-box__btnwrap -amazon">
								<a href="https://www.amazon.co.jp/dp/B0DVKXYBB9?tag=shu65-22&#038;linkCode=ogi&#038;th=1&#038;psc=1" class="pochipp-box__btn" rel="nofollow noopener" target="_blank">
					<span>
						Amazon					</span>
									</a>
			</div>
							<div class="pochipp-box__btnwrap -rakuten">
								<a href="https://hb.afl.rakuten.co.jp/hgc/39c5c75e.b3799909.39c5c75f.e5fd5e7d/?pc=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2F%25E6%2594%25B9%25E8%25A8%2582%25E7%258B%25AC%25E7%25BF%2592Python%25E3%2583%2590%25E3%2582%25A4%25E3%2582%25AA%25E6%2583%2585%25E5%25A0%25B1%25E8%25A7%25A3%25E6%259E%2590&#038;m=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2F%25E6%2594%25B9%25E8%25A8%2582%25E7%258B%25AC%25E7%25BF%2592Python%25E3%2583%2590%25E3%2582%25A4%25E3%2582%25AA%25E6%2583%2585%25E5%25A0%25B1%25E8%25A7%25A3%25E6%259E%2590" class="pochipp-box__btn" rel="nofollow noopener" target="_blank">
					<span>
						楽天市場					</span>
									</a>
			</div>
											</div>
								<div class="pochipp-box__logo">
					<img loading="lazy" decoding="async" src="https://www.mattari-benkyo-note.com/wp-content/plugins/pochipp/assets/img/pochipp-logo-t1.png" alt="" width="32" height="32">
					<span>ポチップ</span>
				</div>
					</div>
	


<h2 class="wp-block-heading">どんな内容の本か？</h2>



<p>年度が変わり、新しい研究室に入ったり、就職した方で「このバイオのデータを解析して」って言われたらどうしますか？<br>私は今の会社に入った最初、いきなりヒトのとあるテーブルデータを渡されて解析の仕事をすることになり、「困ったぞ」となった記憶があります。<br>そんな私のような「困ったぞ」となったと思った人にお勧めなのが「独習Pythonバイオ情報解析」で、Pythonを使って特にテーブルデータを扱う人は共通して使える知識が詰まった本になっています。</p>



<p>特に改訂版になってLLMを使った解析の流れの説明や注意点などが増えていて、これから初めて解析をするぞという人は読んでおくとよさそうなことがいろいろ書いてあります。<br>一方、この本に向かない人はどんな人かというと、テーブルデータではない解析、例えば最近ありそうなのはタンパク質の立体構造系の話などはこの本はあまり参考にならないと思うので別の本を読んだほうが良いかと思います。<br>例えば最近私もこの辺では以下の本を読んで勉強しています。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="QhGCA65O5t"><a href="https://www.mattari-benkyo-note.com/2025/01/14/structural_bioinformatics_book_review/">[書評] AlphaFold時代の構造バイオインフォマティクス実践ガイド ー 構造バイオインフォマティクスを勉強したい人におすすめな１冊</a></blockquote><iframe loading="lazy" class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="&#8220;[書評] AlphaFold時代の構造バイオインフォマティクス実践ガイド ー 構造バイオインフォマティクスを勉強したい人におすすめな１冊&#8221; &#8212; まったり勉強ノート" src="https://www.mattari-benkyo-note.com/2025/01/14/structural_bioinformatics_book_review/embed/#?secret=FWVYHlybyh#?secret=QhGCA65O5t" data-secret="QhGCA65O5t" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<h2 class="wp-block-heading">どんな人にお勧めか？</h2>



<p>今回は以下のような人にお勧めかと思います。</p>



<ol class="wp-block-list">
<li>Pythonがわからないというプログラム初心者</li>



<li>テーブルデータ解析の注意点がわからないという人</li>
</ol>



<p>この本ではPythonに関して、かなり初級者向けに詳しく紹介してくれています。このため、プログラムが初心者という人が最初に読むにはちょうどよさそうに感じます。また、後半ではsingle cellデータを対象にテーブルデータを解析する上で使いそうな検定の話やクラスタリングの話などが出てきます。このような技術はただ使うのであれば大した知識もなく使えるのですが、結果をちゃんと解釈するとなると、今回のケースで適切な検定方法なのかや、適切なパラメータが使われているのかなど、幅広いことを考える必要があります。<br>このようなことが今回の本ではちゃんと書いてある印象なので、この辺を詳しくないという人は一度読んでみることをお勧めします。</p>



<h2 class="wp-block-heading">個人的に良かった点</h2>



<p>個人的に良かった点としては以下の点です。</p>



<ol class="wp-block-list">
<li>改訂版になってLLMを使った例が最初に入っていて参考になった</li>



<li>忘れがちな解析の注意点を思い出せた</li>
</ol>



<p>特に良かったのが1が個人的には良かったです。第２章のLLMを使った章を書いた東君のXを時々見て、そんな使い方できるだーというのは飛び飛びで知ってたのですが、今回ちゃんと本にまとめてくれたおかげで、理解しやすかった印象です。<br>また、後半の検定やクラスタリングなど私自身最近使ってないので、忘れてたことが多かったのですが、そういえばこういう注意点があったということが思い出せたので良かったです。</p>



<h2 class="wp-block-heading">終わりに</h2>



<p>今回は「<a href="https://amzn.to/42k4Ltm" title="改訂独習Pythonバイオ情報解析">改訂独習Pythonバイオ情報解析</a>」が出たので紹介の記事を書きました。バイオインフォマティクス周りは変化が激しく、古い本では知識が古くて使い物にならないケースもあるのですが、今回のように改訂版がでて、ちゃんと新しい知識が増えた本がでて非常にうれしく思います。<br>定期的にこのように本の紹介記事を書いてます。もし興味があれば他の本の記事も見ていただければ幸いです。</p><p>The post <a href="https://www.mattari-benkyo-note.com/2025/04/07/python_bioinfo_book_review/">[書評] 改訂独習Pythonバイオ情報解析 ー バイオのテーブルデータ解析することになったら読む一冊</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.mattari-benkyo-note.com/2025/04/07/python_bioinfo_book_review/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3273</post-id>	</item>
		<item>
		<title>小型LLM PLaMo 2 1BをGoogle ColabでSFTしてみる</title>
		<link>https://www.mattari-benkyo-note.com/2025/02/13/plamo-2-1b-sft/</link>
					<comments>https://www.mattari-benkyo-note.com/2025/02/13/plamo-2-1b-sft/#respond</comments>
		
		<dc:creator><![CDATA[Shuji Suzuki (shu)]]></dc:creator>
		<pubDate>Wed, 12 Feb 2025 23:30:00 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[CUDA]]></category>
		<category><![CDATA[llm]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[pytorch]]></category>
		<category><![CDATA[機械学習]]></category>
		<guid isPermaLink="false">https://www.mattari-benkyo-note.com/?p=3210</guid>

					<description><![CDATA[<p>今回はPreferred Networksとその子会社のPreferred Elementsが共同で開発した1Bサイズの小型のLLM、PLaMo 2 1Bに対してSFTをするコードの紹介になります。 Google Col [&#8230;]</p>
<p>The post <a href="https://www.mattari-benkyo-note.com/2025/02/13/plamo-2-1b-sft/">小型LLM PLaMo 2 1BをGoogle ColabでSFTしてみる</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>今回はPreferred Networksとその子会社のPreferred Elementsが共同で開発した1Bサイズの小型のLLM、<a href="https://huggingface.co/pfnet/plamo-2-1b" title="PLaMo 2 1B">PLaMo 2 1B</a>に対してSFTをするコードの紹介になります。</p>



<p>Google Colabの無料枠で推論を回す方法は前回記事にしましたので、そもそもPLaMo 2 1Bって何と思った方や推論を回してみたいという方はそちらをご覧ください。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="ZZZgUkUP2R"><a href="https://www.mattari-benkyo-note.com/2025/02/12/plamo-2-1b-infernece/">小型LLM PLaMo 2 1BをGoogle Colabの無料枠の範囲で使ってみる</a></blockquote><iframe loading="lazy" class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="&#8220;小型LLM PLaMo 2 1BをGoogle Colabの無料枠の範囲で使ってみる&#8221; &#8212; まったり勉強ノート" src="https://www.mattari-benkyo-note.com/2025/02/12/plamo-2-1b-infernece/embed/#?secret=V6iPyeE1qa#?secret=ZZZgUkUP2R" data-secret="ZZZgUkUP2R" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<p>また、今回説明に使うコードはこちらに置いてありますので、適宜参照してください。</p>



<p><a href="https://github.com/shu65/plamo-2-1b-sft-example">https://github.com/shu65/plamo-2-1b-sft-example</a></p>



<p>Google Colabにおける一連の実行に関してはJupyter Notebookにまとめてありますので、細かい実行方法がわからないという方はこちらをご覧ください</p>



<p><a href="https://github.com/shu65/plamo-2-1b-sft-example/blob/main/run_sft_google_colab.ipynb">https://github.com/shu65/plamo-2-1b-sft-example/blob/main/run_sft_google_colab.ipynb</a></p>



<h2 class="wp-block-heading">Supervised Fine-Tuning(SFT)とは？</h2>



<p>SFTを知らない方に簡単に説明すると、SFTは指示と想定されている回答のペアを用意し、LLMに対して学習を行い、指示に従いやすいモデルを作る方法になります。</p>



<p>特にPLaMo 2 1Bのような事前学習モデルでは、特に指示に従うように学習されていないケースもあり、そのまま利用した際、余計なことをだらだらと出力し続けたり、頓珍漢な回答が返ってきたりという問題が発生することがあります。</p>



<p>このため指示に適切にこたえてもらうための技術がいろいろあるのですが、そのうちの一つにSFTというものがあります。</p>



<h2 class="wp-block-heading">Google ColabでPLaMo 2 1BをSFTする</h2>



<p>それでは本題のGoogle ColabでPLaMo 2 1BをSFTする方法について説明します。今回はGPUメモリの関係上、おそらく無料で使えるT4だと無改造では実行できない気がするのでL4を使った説明をします。</p>



<h3 class="wp-block-heading">L4 GPUの利用</h3>



<p>まず、Google ColabでL4が使えるように、課金が必要になります。</p>



<p>課金についてはこちらをご覧ください。</p>



<p><a href="https://colab.research.google.com/signup?hl=ja">https://colab.research.google.com/signup?hl=ja</a></p>



<p>今回のコードを動かすだけであれば「Pay As You Go」で100 コンピューティング ユニットを購入すれば十分です。この記事を執筆時点では1200円に満たない程度で購入できます。</p>



<p>課金が済んだら、メニューバーから「ランタイム」→「ランタイムのタイプを変更」をクリックします。すると無料枠では選択できないL4 GPUが選択できるようになっていると思うので、L4 GPUを選択します。</p>



<p>これでGPUを使う準備ができました。</p>



<h3 class="wp-block-heading">実行環境準備</h3>



<p>L4を利用するようにしたら、実行するコードのダウンロードやPythonパッケージのインストールを行います。</p>



<p>まずGithubよりコードをcloneしてきます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>!git clone https://github.com/shu65/plamo-2-1b-sft-example.git</code></pre></div>



<p>次に、PyTorchのバージョンを現在の最新版よりも前の以下のものに変更します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>!pip install torch==2.4.1 torchvision==0.19.1 torchaudio==2.4.1 --index-url https://download.pytorch.org/whl/cu124</code></pre></div>



<p>この後は以下のようにPyTorch以外のPLaMo 2 1Bの実行に必要なパッケージやSFTに必要なパッケージなどをインストールします。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>!pip install -r plamo-2-1b-sft-example/requirements.txt</code></pre></div>



<p>ここまで実行すると2025/02/12現在以下のようなバージョンがインストールされました。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>causal-conv1d                      1.5.0.post8
fastrlock                          0.8.3
mamba-ssm                          2.2.4
numba                              0.61.0
numba-cuda                         0.0.17.1
sentence-transformers              3.4.1
torch                              2.4.1+cu124
torchaudio                         2.4.1+cu124
torchsummary                       1.5.1
torchvision                        0.19.1+cu124
transformers                       4.48.2
trl                                0.14.0</code></pre></div>



<p>これであとはSFTのコードを実行すれば、SFTをすることができます。このSFTの中身に関しては次で紹介していきます。</p>



<h3 class="wp-block-heading">PLaMo 2 1BをSFTする</h3>



<p>SFTをする部分は<code>sft.py</code>　というスクリプトにまとめてあります。このスクリプトの重要な部分について簡単にですが説明していきます。</p>



<p>まず、今回はすぐに実行が終わるように少量の質問と回答のペアのデータを用います。</p>



<p>今回は日本語の指示学習でよく使われる<a href="https://huggingface.co/datasets/kunishou/databricks-dolly-15k-ja" target="_blank" rel="noopener" title="kunishou/databricks-dolly-15k-ja">kunishou/databricks-dolly-15k-ja</a>というデータセットのうち、<code>input</code> がなく<code>instruction</code> と<code>output</code> のペアになっているデータのみを取り出しその一部だけを利用します。一つ例を見せると以下のようなデータを利用します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>{
  &quot;output&quot;: &quot;イコクエイラクブカ&quot;,
  &quot;input&quot;: &quot;&quot;,
  &quot;index&quot;: &quot;1&quot;,
  &quot;category&quot;: &quot;classification&quot;,
  &quot;instruction&quot;: &quot;魚の種類はどっち？イコクエイラクブカとロープ&quot;
}</code></pre></div>



<p>一部だけ取り出すコードは以下の通りです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>    dataset = datasets.load_dataset(&quot;kunishou/databricks-dolly-15k-ja&quot;)
    train_dataset = dataset[&quot;train&quot;].filter(lambda data: data[&quot;input&quot;] == &quot;&quot;)</code></pre></div>



<p>次に<code>SFTConfig</code> というSFTの実行の設定のクラスのインスタンスを用意します。具体的には以下の通りです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>    sft_args = SFTConfig(
        output_dir=&quot;./outputs&quot;,
        evaluation_strategy=&quot;no&quot;,
        per_device_train_batch_size=1,
        gradient_accumulation_steps=4,
        learning_rate=5e-5,
        num_train_epochs=0.1,
        lr_scheduler_type=&quot;cosine&quot;,
        warmup_ratio=0.3,
        logging_steps=10,
        save_strategy=&quot;epoch&quot;,
        report_to=&quot;tensorboard&quot;,
        bf16=True,
        max_seq_length=1024,
        gradient_checkpointing=True,
        deepspeed=&#39;./deepspeed_config.json&#39;,
    )</code></pre></div>



<p>重要なこととして、今回はGPUのメモリが少ないため、DeepSpeedのStage 3という学習時に一部のデータをCPU側に置いておくモードを利用します。</p>



<p>これによりGPUメモリが少ない環境でもSFTを回すことができます。</p>



<p>DeepSpeed周りの設定は<code>deepspeed_config.json</code> に書いてありますので気になる方はご覧ください。</p>



<p>また、今回は学習データの10%だけを利用するようにしています。これはこの学習を早く終わらせるためであり、本来はもっと回す必要があると考えられますので、本気でSFTをする場合は注意してください。</p>



<p>次にデータをどのようなフォーマットでLLMに入力するかを指定する<code>formatting_func</code> という関数を用意します。今回は以下のようにしました。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>INSTRUCTION_TEMPLATE = string.Template(
    &quot;&quot;&quot;### Question:
${input}

### Answer:
${response}&lt;|plamo:eos|&gt;
&quot;&quot;&quot;
)


def formatting_func(examples):
    output_texts = []
    for i in range(len(examples[&#39;instruction&#39;])):
        text = INSTRUCTION_TEMPLATE.substitute(input=examples[&#39;instruction&#39;][i], response=examples[&#39;output&#39;][i])
        output_texts.append(text)
    return output_texts</code></pre></div>



<p><code>INSTRUCTION_TEMPLATE</code> が今回のフォーマットで、<code>### Question:\n</code> の後に指示、<code>### Answer:\n</code> のあとに回答が続き、最後にend of sequenceである<code>&lt;|plamo:eos|&gt;</code> が来るようになっています。</p>



<p>また、学習時には回答部分だけを学習してほしいので、どこからが回答かがわかるように<code>‎DataCollatorForCompletionOnlyLM</code> のインスタンスも用意します。これは以下の通りです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>    data_collator = DataCollatorForCompletionOnlyLM(
        response_template=tokenizer.encode(&quot; Answer:\n&quot;, add_special_tokens=False),
        tokenizer=tokenizer
    )
</code></pre></div>



<p><code>response_template</code> のところで回答前の部分がどのようなtoken idになるかを指定する部分があるので、上記のように指定します。前後の文字の影響で指定したtoken idが出現しないケースがあるので、その時はいろいろ<code>response_template</code> に指定する文字列を調整してみてください。</p>



<p>最後にSFTを実行するためのクラスの<code>‎SFTTrainer</code> を以下のように用意します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>    trainer = SFTTrainer(
        model=model,
        args=sft_args,
        data_collator=data_collator,
        train_dataset=train_dataset,
        tokenizer=tokenizer,
        formatting_func=formatting_func,
    )</code></pre></div>



<p>そして、以下のように実行し、結果を保存します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>    trainer.train()
    trainer.save_model()</code></pre></div>



<p>これで学習が終わると<code>SFTConfig</code> の<code>output_dir</code> で指定した<code>./outputs</code> に結果が出力されます。試しに私がGoogle Colabで実行した際は13分程度で学習が終わりました。コンピューティングユニットとしてはパッケージなどのインストールも含めて4だけ消費しました。</p>



<h3 class="wp-block-heading">SFTされたモデルで推論してみる</h3>



<p>最後にSFTされたモデルで推論するというのを行います。</p>



<p>これはPLaMo 2 1Bのexampleとほぼ同じでpromptだけ少し変えたものを例として用います。コードとしては以下の通りです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>from transformers import AutoTokenizer, AutoModelForCausalLM
import torch


model_name = &quot;./plamo-2-1b-sft-example/outputs&quot;

tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_name, trust_remote_code=True)


# プロンプトの準備
prompt = &quot;### Question:\n埼玉の県庁所在地は何市？\n\n### Answer:\n&quot;

# 推論の実行
inputs = tokenizer(prompt, return_tensors=&quot;pt&quot;)
generated_tokens = model.generate(
    **inputs,
    max_new_tokens=64,
    pad_token_id=tokenizer.pad_token_id,
)[0]
generated_text = tokenizer.decode(generated_tokens)
print(generated_text)</code></pre></div>



<p>出力結果は以下のようになります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>&lt;|plamo:bos|&gt;### Question:
埼玉の県庁所在地は何市？

### Answer:
埼玉県の県庁所在地はさいたま市です。&lt;|plamo:eos|&gt;</code></pre></div>



<p>ちゃんと学習で指定されたように<code>### Answer:\n</code> の後に質問に対する回答をし、その後<code>&lt;|plamo:eos|&gt;</code> を出力するということができています。</p>



<p>ちなみにSFTしていないモデルではどうなるかというと、以下のように余計なことを出力するうえ、出力が止まらないという状態になっています。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>&lt;|plamo:bos|&gt;### Question:
埼玉の県庁所在地は何市？

### Answer:
さいたま市

### 解説
「県庁所在地」とは、都道府県庁が置かれている都市のことです。
「さいたま市」は埼玉県の県庁所在地です。

### 関連記事
### 取り急ぎお知らせ
「埼玉の県庁所在地は何市？」の解説は以上です。
「埼玉の県庁所在地は何市？」の解説は以上です。</code></pre></div>



<p>このため、SFTでうまくフォーマットに従うよう学習できたと考えられます。</p>



<h2 class="wp-block-heading">終わりに</h2>



<p>今回はPLaMo 2 1Bを使ってSFTをする例を示しました。今回示したように簡単なSFTなら十分Google Colabで実行することができます。みなさんもぜひいろいろ試していただければと思います。</p><p>The post <a href="https://www.mattari-benkyo-note.com/2025/02/13/plamo-2-1b-sft/">小型LLM PLaMo 2 1BをGoogle ColabでSFTしてみる</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.mattari-benkyo-note.com/2025/02/13/plamo-2-1b-sft/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3210</post-id>	</item>
		<item>
		<title>[書評] AlphaFold時代の構造バイオインフォマティクス実践ガイド ー 構造バイオインフォマティクスを勉強したい人におすすめな１冊</title>
		<link>https://www.mattari-benkyo-note.com/2025/01/14/structural_bioinformatics_book_review/</link>
					<comments>https://www.mattari-benkyo-note.com/2025/01/14/structural_bioinformatics_book_review/#respond</comments>
		
		<dc:creator><![CDATA[Shuji Suzuki (shu)]]></dc:creator>
		<pubDate>Mon, 13 Jan 2025 23:30:00 +0000</pubDate>
				<category><![CDATA[書評]]></category>
		<category><![CDATA[バイオインフォマティクス]]></category>
		<category><![CDATA[書籍]]></category>
		<category><![CDATA[機械学習]]></category>
		<guid isPermaLink="false">https://www.mattari-benkyo-note.com/?p=3130</guid>

					<description><![CDATA[<p>今日は「AlphaFold時代の構造バイオインフォマティクス実践ガイド　今日からできる！構造データの基本操作から相互作用の推定、タンパク質デザインまで」を読んで、私が今まで読んだ構造バイオインフォマティクス関係の本で一番 [&#8230;]</p>
<p>The post <a href="https://www.mattari-benkyo-note.com/2025/01/14/structural_bioinformatics_book_review/">[書評] AlphaFold時代の構造バイオインフォマティクス実践ガイド ー 構造バイオインフォマティクスを勉強したい人におすすめな１冊</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>今日は「<a href="https://amzn.to/3DKtsXx" target="_blank" rel="noopener" title="AlphaFold時代の構造バイオインフォマティクス実践ガイド　今日からできる！構造データの基本操作から相互作用の推定、タンパク質デザインまで">AlphaFold時代の構造バイオインフォマティクス実践ガイド　今日からできる！構造データの基本操作から相互作用の推定、タンパク質デザインまで</a>」を読んで、私が今まで読んだ構造バイオインフォマティクス関係の本で一番素晴らしい本だったので、読んだ勢いのまま書いた紹介記事になります。</p>


		<div class="pochipp-box"
			data-id="3129"
			data-img="l"
			data-lyt-pc="dflt"
			data-lyt-mb="vrtcl"
			data-btn-style="dflt"
			data-btn-radius="on"
			data-sale-effect="none"
			 data-cvkey="0bd51215"		>
							<div class="pochipp-box__image">
					<a href="https://www.amazon.co.jp/dp/4758122768?tag=shu65-22&#038;linkCode=ogi&#038;th=1&#038;psc=1" rel="nofollow noopener" target="_blank">
						<img loading="lazy" decoding="async" src="https://m.media-amazon.com/images/I/51qiGOktoEL._SL500_.jpg" alt="" width="120" height="120" />					</a>
				</div>
						<div class="pochipp-box__body">
				<div class="pochipp-box__title">
					<a href="https://www.amazon.co.jp/dp/4758122768?tag=shu65-22&#038;linkCode=ogi&#038;th=1&#038;psc=1" rel="nofollow noopener" target="_blank">
						AlphaFold時代の構造バイオインフォマティクス実践ガイド〜今日からできる！構造データの基本操作から相互作用の推定、タンパク質デザインまで (実験医学別冊　最強のステップUPシリーズ)					</a>
				</div>

									<div class="pochipp-box__info">羊土社</div>
				
				
							</div>
				<div class="pochipp-box__btns"
		data-maxclmn-pc="fit"
		data-maxclmn-mb="1"
	>
					<div class="pochipp-box__btnwrap -amazon">
								<a href="https://www.amazon.co.jp/dp/4758122768?tag=shu65-22&#038;linkCode=ogi&#038;th=1&#038;psc=1" class="pochipp-box__btn" rel="nofollow noopener" target="_blank">
					<span>
						Amazon					</span>
									</a>
			</div>
							<div class="pochipp-box__btnwrap -rakuten">
								<a href="https://hb.afl.rakuten.co.jp/hgc/39c5c75e.b3799909.39c5c75f.e5fd5e7d/?pc=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2FAlphaFold%25E6%2599%2582%25E4%25BB%25A3%25E3%2581%25AE%25E6%25A7%258B%25E9%2580%25A0%25E3%2583%2590%25E3%2582%25A4%25E3%2582%25AA%25E3%2582%25A4%25E3%2583%25B3%25E3%2583%2595%25E3%2582%25A9%25E3%2583%259E%25E3%2583%2586%25E3%2582%25A3%25E3%2582%25AF%25E3%2582%25B9%25E5%25AE%259F%25E8%25B7%25B5%25E3%2582%25AC%25E3%2582%25A4%25E3%2583%2589&#038;m=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2FAlphaFold%25E6%2599%2582%25E4%25BB%25A3%25E3%2581%25AE%25E6%25A7%258B%25E9%2580%25A0%25E3%2583%2590%25E3%2582%25A4%25E3%2582%25AA%25E3%2582%25A4%25E3%2583%25B3%25E3%2583%2595%25E3%2582%25A9%25E3%2583%259E%25E3%2583%2586%25E3%2582%25A3%25E3%2582%25AF%25E3%2582%25B9%25E5%25AE%259F%25E8%25B7%25B5%25E3%2582%25AC%25E3%2582%25A4%25E3%2583%2589" class="pochipp-box__btn" rel="nofollow noopener" target="_blank">
					<span>
						楽天市場					</span>
									</a>
			</div>
											</div>
								<div class="pochipp-box__logo">
					<img loading="lazy" decoding="async" src="https://www.mattari-benkyo-note.com/wp-content/plugins/pochipp/assets/img/pochipp-logo-t1.png" alt="" width="32" height="32">
					<span>ポチップ</span>
				</div>
					</div>
	


<h2 class="wp-block-heading">どんな内容の本か？</h2>



<p>みなさん、「構造バイオインフォマティクス」を勉強しようと思って挫折した経験はないでしょうか？私は何度もあります。<br>私自身、元々バイオインフォマティクスをやってた人間なこともあり、「構造バイオインフォマティクス」は一度はちゃんと勉強したいと常々思っています。<br>ただ、構造バイオインフォマティクスは分野としては幅広く、またAlphaFoldが出たおかげで急速に分野が発展している印象もあり、勉強するといっても何から手をつけていいのかよくわからないと思っていました。</p>



<p>そこに出たのがこの「AlphaFold時代の構造バイオインフォマティクス実践ガイド」です。この本は構造バイオインフォマティクスと聞いて思い浮かべる内容が網羅されているだけでなく、各タスクにおいて有名なツールや出てきた結果について具体的に教えてくれる本となっています。<br>なので、手を動かして「構造バイオインフォマティクス」を勉強したいと思ったら、今なら一番良い本だと思っています。</p>



<h2 class="wp-block-heading">どんな人にお勧めか？</h2>



<p>個人的には以下のような人におすすめかと思います。</p>



<ol class="wp-block-list">
<li>独学で手を動かしながら構造バイオインフォマティクスを勉強したい人</li>



<li>構造バイオインフォマティクスがどういうことをやる分野なのか知りたい人</li>
</ol>



<p>特に私のような１の人は特にお勧めかと思います。多くの章で有名なツールとそのツールの具体的な実行方法が載っているので、自分でも試したい！と思ったら試せるようになっているので非常に良かったです。</p>



<p>また、昨年AlphaFoldがノーベル賞を取ったこともあり、この辺の分野知りたいと思っている人もいるかと思います。その際、手っ取り早く網羅的にこの辺の分野を知りたいのであればこの本をパラ読みするのが今はちょうどよいかもと思っています。</p>



<h2 class="wp-block-heading">個人的に良かった点</h2>



<p>個人的に良かった点は以下のところです。</p>



<ol class="wp-block-list">
<li>各ツールの使い方が結構細かく書いてある</li>



<li>各ツールの結果として、メトリックの説明と解釈についていろいろ書いてある</li>
</ol>



<p>今まで構造バイオインフォマティクスについて勉強したいと思った際、ツールの使い方がよくわからない、または出てきた結果をどう解釈していいのかわからないという状況になりました。この結果、仕事の片手間に勉強するのは難しく何度も挫折してきました。このため、1や2が詳しく書いてある本があればと思っていたので、この本は非常に良い本だと思い、今年こそ頑張れそうな気がしています。</p>



<h2 class="wp-block-heading">終わりに</h2>



<p>今日は「<a href="https://amzn.to/3DKtsXx" target="_blank" rel="noopener" title="AlphaFold時代の構造バイオインフォマティクス実践ガイド　今日からできる！構造データの基本操作から相互作用の推定、タンパク質デザインまで">AlphaFold時代の構造バイオインフォマティクス実践ガイド　今日からできる！構造データの基本操作から相互作用の推定、タンパク質デザインまで</a>」を読んで非常によかったので紹介記事を書きました。<br>定期的にこのように本の紹介記事を書いてます。もし興味があれば他の本の記事も見ていただければ幸いです。</p><p>The post <a href="https://www.mattari-benkyo-note.com/2025/01/14/structural_bioinformatics_book_review/">[書評] AlphaFold時代の構造バイオインフォマティクス実践ガイド ー 構造バイオインフォマティクスを勉強したい人におすすめな１冊</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.mattari-benkyo-note.com/2025/01/14/structural_bioinformatics_book_review/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3130</post-id>	</item>
		<item>
		<title>[書評] 生成ＡＩのしくみ ー 生成AIの進化の歴史が分かる一冊</title>
		<link>https://www.mattari-benkyo-note.com/2024/12/23/how_generative_ai_works_book_review/</link>
					<comments>https://www.mattari-benkyo-note.com/2024/12/23/how_generative_ai_works_book_review/#respond</comments>
		
		<dc:creator><![CDATA[Shuji Suzuki (shu)]]></dc:creator>
		<pubDate>Sun, 22 Dec 2024 23:30:00 +0000</pubDate>
				<category><![CDATA[書評]]></category>
		<category><![CDATA[拡散モデル]]></category>
		<category><![CDATA[書籍]]></category>
		<category><![CDATA[機械学習]]></category>
		<guid isPermaLink="false">https://www.mattari-benkyo-note.com/?p=3031</guid>

					<description><![CDATA[<p>多分まじめな本の書評は今年最後かなと思います。今回は「生成ＡＩのしくみ　〈流れ〉が画像・音声・動画をつくる」という本を読んだのでその紹介です。 どんな内容の本か？ 皆さん、生成AIのニュースが毎日のようにでている気がしま [&#8230;]</p>
<p>The post <a href="https://www.mattari-benkyo-note.com/2024/12/23/how_generative_ai_works_book_review/">[書評] 生成ＡＩのしくみ ー 生成AIの進化の歴史が分かる一冊</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>多分まじめな本の書評は今年最後かなと思います。今回は「<a href="https://amzn.to/4gMGm5l" target="_blank" rel="noopener" title="">生成ＡＩのしくみ　〈流れ〉が画像・音声・動画をつくる</a>」という本を読んだのでその紹介です。</p>


		<div class="pochipp-box"
			data-id="3030"
			data-img="l"
			data-lyt-pc="dflt"
			data-lyt-mb="vrtcl"
			data-btn-style="dflt"
			data-btn-radius="on"
			data-sale-effect="none"
			 data-cvkey="0af8863c"		>
							<div class="pochipp-box__image">
					<a href="https://www.amazon.co.jp/dp/B0CW1F9QLJ?tag=shu65-22&#038;linkCode=ogi&#038;th=1&#038;psc=1" rel="nofollow noopener" target="_blank">
						<img loading="lazy" decoding="async" src="https://m.media-amazon.com/images/I/41Sdn6LevAL._SL500_.jpg" alt="" width="120" height="120" />					</a>
				</div>
						<div class="pochipp-box__body">
				<div class="pochipp-box__title">
					<a href="https://www.amazon.co.jp/dp/B0CW1F9QLJ?tag=shu65-22&#038;linkCode=ogi&#038;th=1&#038;psc=1" rel="nofollow noopener" target="_blank">
						生成ＡＩのしくみ　〈流れ〉が画像・音声・動画をつくる (岩波科学ライブラリー)					</a>
				</div>

									<div class="pochipp-box__info">岡野原 大輔</div>
				
				
							</div>
				<div class="pochipp-box__btns"
		data-maxclmn-pc="fit"
		data-maxclmn-mb="1"
	>
					<div class="pochipp-box__btnwrap -amazon">
								<a href="https://www.amazon.co.jp/dp/B0CW1F9QLJ?tag=shu65-22&#038;linkCode=ogi&#038;th=1&#038;psc=1" class="pochipp-box__btn" rel="nofollow noopener" target="_blank">
					<span>
						Amazon					</span>
									</a>
			</div>
							<div class="pochipp-box__btnwrap -rakuten">
								<a href="https://hb.afl.rakuten.co.jp/hgc/39c5c75e.b3799909.39c5c75f.e5fd5e7d/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F18063978%2F%3Frafcid%3Dwsc_i_is_1074984852215714305&#038;m=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F18063978%2F%3Frafcid%3Dwsc_i_is_1074984852215714305" class="pochipp-box__btn" rel="nofollow noopener" target="_blank">
					<span>
						楽天市場					</span>
									</a>
			</div>
														<div class="pochipp-box__btnwrap -custom">
								<a href="https://amzn.to/3P9Uv0U" class="pochipp-box__btn" rel="nofollow noopener" target="_blank">
					<span>
						Amazon Kindle					</span>
				</a>
			</div>
					</div>
								<div class="pochipp-box__logo">
					<img loading="lazy" decoding="async" src="https://www.mattari-benkyo-note.com/wp-content/plugins/pochipp/assets/img/pochipp-logo-t1.png" alt="" width="32" height="32">
					<span>ポチップ</span>
				</div>
					</div>
	


<h2 class="wp-block-heading">どんな内容の本か？</h2>



<p>皆さん、生成AIのニュースが毎日のようにでている気がしますが画像や動画などのデータを生成する仕組みを簡単に説明することができるでしょうか？私は、自分の親にこれらの仕組みを説明できるほど分かりやすい説明はできないと思っていますが、この本はそんなAIについて詳しくない人向けに画像や動画などをどのようにAIが作っているか、技術の進化の歴史を交えて分かりやすく説明した本です。</p>



<p>この本の特徴としては普通の人が挫折せずに読めるように数式が一切出てこず、分かりにくい英語の専門用語も極力日本語訳をあてて、難しいところはイラストを使って分かりやすく説明されているのを感じました。<br>一方、これらの影響で私のような専門に近ければ近いほど、日本語訳に馴染みがなくて、これがどの論文の話をいっているのかぱっと分かりにくいところがあるうえに、数式が何もないこともあり、細かい部分が全くわからない本にもなっています。</p>



<p>このため、詳しく知りたい人は別の本、例えば同じ著者のこちらの本を読むほうが良いと思います。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="fNzTSoQvw8"><a href="https://www.mattari-benkyo-note.com/2023/02/23/diffusion_model_book_review/">[書評] 拡散モデル データ生成技術の数理 ー 目覚ましい画像生成の発展の裏側を知りたい人へ</a></blockquote><iframe loading="lazy" class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="&#8220;[書評] 拡散モデル データ生成技術の数理 ー 目覚ましい画像生成の発展の裏側を知りたい人へ&#8221; &#8212; まったり勉強ノート" src="https://www.mattari-benkyo-note.com/2023/02/23/diffusion_model_book_review/embed/#?secret=5ecG4oXyjk#?secret=fNzTSoQvw8" data-secret="fNzTSoQvw8" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<h2 class="wp-block-heading">どんな人にお勧めか？</h2>



<p>おそらく以下のような人にお勧めかなと思っています。</p>



<ol class="wp-block-list">
<li>生成AIについて知りたいが数式が得意ではない人</li>



<li>生成AIの発展の歴史を知りたい人</li>
</ol>



<p>特にお勧めなのが1の人で、生成AIについて技術的な説明をしている本やすごい軽く説明している本はいくつかありますが、その中間くらいの数式は苦手だけどどのような仕組みで動いているのか知りたい人にはちょうどよい印象の本です。</p>



<p>また、これまで生成AIの取り組みはいろいろあったのですが、その発展の歴史を知りたいと思った人にもお勧めかと思います。<br>この本ではノーベル賞で話題になったホップフィールドネットワークの話題から生成AIへの流れを順番に説明されいて、ノーベル賞と生成AIがどうつながっているのかもわかるようになると思います。</p>



<h2 class="wp-block-heading">個人的に良かった点</h2>



<p>個人的に良かった点としては以下の通りです。</p>



<ol class="wp-block-list">
<li>生成AIの歴史について飛び飛びの部分を補完できた</li>



<li>人に生成AIを説明するときどういう言い回しがいいのかの参考になった</li>
</ol>



<p>特に1に関しては私も専門分野とはいえ、2017年くらいから深層学習の技術開発を始めた関係で、それよりも前の部分は人に説明できるような状態ではなかったのですが、そのあたりの歴史について知ることができたのは良かったです。</p>



<p>また、2に関して、生成AIは人に説明が難しいところが多いのですが、それをどういう風に説明すれば良いか少し分かった気がするので、その点も良かったです。</p>



<h2 class="wp-block-heading">終わりに</h2>



<p>今回は「<a href="https://amzn.to/4gMGm5l" target="_blank" rel="noopener" title="">生成ＡＩのしくみ　〈流れ〉が画像・音声・動画をつくる</a>」という本を紹介しました。最初のほうにも書きましたが、この本は普通の人向けの本であり、技術的な詳細を知りたい方は例えば同じ著者の「<a href="https://amzn.to/406cV8S" target="_blank" rel="noopener" title="">拡散モデル データ生成技術の数理</a>」や手を動かして勉強できる「<a href="https://amzn.to/4fylZaW" target="_blank" rel="noopener" title="">ゼロから作るDeep Learning ❺ ―生成モデル編</a>」が良いかと思っています。<br>「拡散モデル データ生成技術の数理」の方は紹介記事を書いたので参考にしてください。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="fNzTSoQvw8"><a href="https://www.mattari-benkyo-note.com/2023/02/23/diffusion_model_book_review/">[書評] 拡散モデル データ生成技術の数理 ー 目覚ましい画像生成の発展の裏側を知りたい人へ</a></blockquote><iframe loading="lazy" class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="&#8220;[書評] 拡散モデル データ生成技術の数理 ー 目覚ましい画像生成の発展の裏側を知りたい人へ&#8221; &#8212; まったり勉強ノート" src="https://www.mattari-benkyo-note.com/2023/02/23/diffusion_model_book_review/embed/#?secret=5ecG4oXyjk#?secret=fNzTSoQvw8" data-secret="fNzTSoQvw8" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<p>定期的にこのような書評を書いているので、もし興味があれば他の本の記事も見ていただければ幸いです。</p><p>The post <a href="https://www.mattari-benkyo-note.com/2024/12/23/how_generative_ai_works_book_review/">[書評] 生成ＡＩのしくみ ー 生成AIの進化の歴史が分かる一冊</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.mattari-benkyo-note.com/2024/12/23/how_generative_ai_works_book_review/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3031</post-id>	</item>
		<item>
		<title>[書評] ソフトウェア工学から学ぶ機械学習の品質問題 ー 機械学習のテストをどうすればよいか悩んだら読む一冊</title>
		<link>https://www.mattari-benkyo-note.com/2023/10/09/machine_learning_test_book_review/</link>
					<comments>https://www.mattari-benkyo-note.com/2023/10/09/machine_learning_test_book_review/#respond</comments>
		
		<dc:creator><![CDATA[Shuji Suzuki (shu)]]></dc:creator>
		<pubDate>Sun, 08 Oct 2023 22:49:58 +0000</pubDate>
				<category><![CDATA[書評]]></category>
		<category><![CDATA[テスト]]></category>
		<category><![CDATA[書籍]]></category>
		<category><![CDATA[機械学習]]></category>
		<guid isPermaLink="false">https://www.mattari-benkyo-note.com/?p=2861</guid>

					<description><![CDATA[<p>今回は隔週で上げている本の紹介回です。今回は「ソフトウェア工学から学ぶ 機械学習の品質問題」という本を読んだので、その感想になります。 どんな内容の本か？ ソフトウェアを開発していればテストが大事なのは百も承知だと思いま [&#8230;]</p>
<p>The post <a href="https://www.mattari-benkyo-note.com/2023/10/09/machine_learning_test_book_review/">[書評] ソフトウェア工学から学ぶ機械学習の品質問題 ー 機械学習のテストをどうすればよいか悩んだら読む一冊</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>今回は隔週で上げている本の紹介回です。今回は「<a href="https://amzn.to/3LTxtKq" target="_blank" rel="noopener" title="ソフトウェア工学から学ぶ 機械学習の品質問題">ソフトウェア工学から学ぶ 機械学習の品質問題</a>」という本を読んだので、その感想になります。</p>



<div style="text-align: center;">
<a href="https://www.amazon.co.jp/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E5%B7%A5%E5%AD%A6%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6-%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E5%93%81%E8%B3%AA%E5%95%8F%E9%A1%8C-%E4%B8%AD%E5%B3%B6%E9%9C%87-ebook/dp/B09992K8XS?_encoding=UTF8&#038;qid=&#038;sr=&#038;linkCode=li3&#038;tag=shu65-22&#038;linkId=9e690acb7bb812772475576eecce01e4&#038;language=ja_JP&#038;ref_=as_li_ss_il" target="_blank" rel="noopener"><img decoding="async" border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&#038;ASIN=B09992K8XS&#038;Format=_SL250_&#038;ID=AsinImage&#038;MarketPlace=JP&#038;ServiceVersion=20070822&#038;WS=1&#038;tag=shu65-22&#038;language=ja_JP" ></a><img loading="lazy" decoding="async" src="https://ir-jp.amazon-adsystem.com/e/ir?t=shu65-22&#038;language=ja_JP&#038;l=li3&#038;o=9&#038;a=B09992K8XS" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
</div>



<h2 class="wp-block-heading">どんな内容の本か？</h2>



<p>ソフトウェアを開発していればテストが大事なのは百も承知だと思いますが、「機械学習のテストってどうやるの？」と思ったことはないでしょうか。この本ではそんな機械学習のテストをどうやればいいのかについてまとめた本です。</p>



<p>この本では最初に一般的なソフトウェアテストの方法から入りその後、データセットの品質、深層学習のテストなどを説明しています。<br>機械学習といってもいろいろなモデルがありますが、この本では深層学習多めですが、一部に関しては他のモデルでも使えると思っています。<br>注意点として2020年の本で深層学習を扱っているので、進歩がすごい速い深層学習界隈からすると情報が古い感じがありますので、最新の情報がほしいという場合は研究論文をあたるほうが良いかもしれません。</p>



<h2 class="wp-block-heading">どんな人にお勧めか？</h2>



<p>個人的には以下のような人におすすめかと思っています。</p>



<ol class="wp-block-list">
<li>機械学習の品質について勉強したい方</li>



<li>企業で機械学習の品質をどう保証すればよいか悩んでる方</li>
</ol>



<p>私自身、企業で機械学習を使ったサービス開発をしていることもあり、2の立場でどうすればよいか悩むことが多いです。このためこの本を通して何を気にするべきかのまとめを知ることができたので、今後サービスを開発する上で参考にできそうだと思っています。</p>



<h2 class="wp-block-heading">個人的に良かった点</h2>



<p>個人的に良かったこととしては以下の通りです。</p>



<ol class="wp-block-list">
<li>今後機械学習サービス開発で注意すべきことのまとめを知ることができた。</li>



<li>一般的なソフトウェアのテストの基本も学ぶことができた</li>
</ol>



<p>1に関しては先ほども書いた通りです。2に関しては3章で気保温的なソフトウェアのテストについて書かれていて、期待してなかったですが、この部分が意外にも勉強になることが多かったです。私自身はunittestのような簡単なテスト手法については書籍などで勉強をしたことがある程度だったので、この本で紹介されていたメタモルフィックテスティングという方法を知りませんでした。（正確にはメタモルフィックテスティングという名前がついているということを知らずに似たようなことをしていた）このようにソフトウェアのテストの基礎も勉強できたので良かったです。</p>



<h2 class="wp-block-heading">終わりに</h2>



<p>今回は「<a href="https://amzn.to/3LTxtKq" target="_blank" rel="noreferrer noopener">ソフトウェア工学から学ぶ 機械学習の品質問題</a>」を読んだので紹介しました。テストは難しい<br>今回は隔週でこのように本の紹介記事を書いてます。もし興味があれば他の本の記事も観ていただければ幸いです。</p><p>The post <a href="https://www.mattari-benkyo-note.com/2023/10/09/machine_learning_test_book_review/">[書評] ソフトウェア工学から学ぶ機械学習の品質問題 ー 機械学習のテストをどうすればよいか悩んだら読む一冊</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.mattari-benkyo-note.com/2023/10/09/machine_learning_test_book_review/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2861</post-id>	</item>
		<item>
		<title>[書評] 大規模言語モデルは新たな知能か ー 専門家じゃない人がChatGPTの技術的なことを知りたいと思ったら最適な一冊</title>
		<link>https://www.mattari-benkyo-note.com/2023/07/03/llm_book_review/</link>
					<comments>https://www.mattari-benkyo-note.com/2023/07/03/llm_book_review/#respond</comments>
		
		<dc:creator><![CDATA[Shuji Suzuki (shu)]]></dc:creator>
		<pubDate>Mon, 03 Jul 2023 00:19:32 +0000</pubDate>
				<category><![CDATA[書評]]></category>
		<category><![CDATA[llm]]></category>
		<category><![CDATA[書籍]]></category>
		<category><![CDATA[機械学習]]></category>
		<guid isPermaLink="false">https://www.mattari-benkyo-note.com/?p=2835</guid>

					<description><![CDATA[<p>今回は「大規模言語モデルは新たな知能か――ChatGPTが変えた世界」を読んだのでその書評回です。 どんな内容の本か？ ChatGPTをいろいろなところで目にしますが、そもそもChatGPTってどういう仕組みなんだろう、 [&#8230;]</p>
<p>The post <a href="https://www.mattari-benkyo-note.com/2023/07/03/llm_book_review/">[書評] 大規模言語モデルは新たな知能か ー 専門家じゃない人がChatGPTの技術的なことを知りたいと思ったら最適な一冊</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>今回は「<a href="https://amzn.to/437mvXl" target="_blank" rel="noopener" title="大規模言語モデルは新たな知能か――ChatGPTが変えた世界">大規模言語モデルは新たな知能か――ChatGPTが変えた世界</a>」を読んだのでその書評回です。</p>



<div style="text-align: center;">
<a href="https://www.amazon.co.jp/%E5%A4%A7%E8%A6%8F%E6%A8%A1%E8%A8%80%E8%AA%9E%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AF%E6%96%B0%E3%81%9F%E3%81%AA%E7%9F%A5%E8%83%BD%E3%81%8B%E2%80%95%E2%80%95ChatGPT%E3%81%8C%E5%A4%89%E3%81%88%E3%81%9F%E4%B8%96%E7%95%8C-%E5%B2%A9%E6%B3%A2%E7%A7%91%E5%AD%A6%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%83%BC-%E5%B2%A1%E9%87%8E%E5%8E%9F-%E5%A4%A7%E8%BC%94/dp/4000297198?&#038;linkCode=li3&#038;tag=shu65-22&#038;linkId=54c23a89cfa982431a03af7222213e63&#038;language=ja_JP&#038;ref_=as_li_ss_il" target="_blank" rel="noopener"><img decoding="async" border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&#038;ASIN=4000297198&#038;Format=_SL250_&#038;ID=AsinImage&#038;MarketPlace=JP&#038;ServiceVersion=20070822&#038;WS=1&#038;tag=shu65-22&#038;language=ja_JP" ></a><img loading="lazy" decoding="async" src="https://ir-jp.amazon-adsystem.com/e/ir?t=shu65-22&#038;language=ja_JP&#038;l=li3&#038;o=9&#038;a=4000297198" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
</div>



<h2 class="wp-block-heading">どんな内容の本か？</h2>



<p>ChatGPTをいろいろなところで目にしますが、そもそもChatGPTってどういう仕組みなんだろう、今までの機械学習のモデルとは何が違うんだろう？と思ったことはないでしょうか？</p>



<p>ChatGPTが流行り始めたとき、そのような内容のblogをよく見ましたが、この本では一般的な人向けに、利点やリスク、今後どう付き合っていくべきか？などに加えて、どうしてChatGPTみたいなものが生まれたのかという点について時系列でどのような研究があったのかを紹介しています。</p>



<p>専門家じゃない人は突然ChatGPTみたいなものができるようになったように思いがちかもしれませんが、着実な進歩の上に成り立っている技術であることがわかると思います。</p>



<h2 class="wp-block-heading">どんな人にお勧めか？</h2>



<p>個人的には以下のような人にお勧めかと思います。</p>



<ol class="wp-block-list">
<li>ChatGPTにはどのような利点やリスクがあるのかを知りたい方</li>



<li>AIの専門家ではないが、ChatGPTに関係する研究の流れなどを知りたい方</li>



<li>言語モデルについて何も知りたいから勉強したい方</li>
</ol>



<p>普通の社会人の方は1の方が多いと思いますが、この本は一般人向けに書かれているので、難しい話はほとんどなくサクサク読めるのでお勧めです。また、言語モデルの専門家ではない人が軽くChatGPTがどういうものかを知りたい場合も良い本かと思います。</p>



<p>一方、専門家の方はおそらくよく知った内容が多いと思われます。このため物足りない内容になっていると思うので、そういう方はあまりお勧めはしません。<br>また、ChatGPTについての具体的な使い方や使いこなすコツみたいなものは書かれてないので、そのあたりが知りたい方も注意してください。</p>



<h2 class="wp-block-heading">個人的に良かった点</h2>



<p>個人的には以下の点が良かったです。</p>



<ol class="wp-block-list">
<li>ChatGPTについて幅広い内容を押さえていて、まずこれを読むといいという本になっている</li>



<li>利点やリスク、今後どうChatGPTに付き合っていくべきかの作者の考えているのかの一端が分かる</li>
</ol>



<p>ChatGPTについてはいろいろなblog記事や本がでています。その中でも「どんな内容の本か？」で述べた点については１冊にまとまっていて分かりやすかった印象です。<br>また、実は作者は直属の上司で、普段話していて利点やリスク等についての考えの概要みたいなものは知っていました。ただ、このような本になっていると話しているだけではわからない細かいつながりも理解できて良かったと思いました。</p>



<h2 class="wp-block-heading">終わりに</h2>



<p>今回は「<a href="https://amzn.to/437mvXl" target="_blank" rel="noopener" title="大規模言語モデルは新たな知能か――ChatGPTが変えた世界">大規模言語モデルは新たな知能か――ChatGPTが変えた世界</a>」を読んだのでその書評回です。<br>他にも毎週１冊は本の書評の記事を書いていますので、本が好きな方は他の記事も見ていただけると幸いです。</p><p>The post <a href="https://www.mattari-benkyo-note.com/2023/07/03/llm_book_review/">[書評] 大規模言語モデルは新たな知能か ー 専門家じゃない人がChatGPTの技術的なことを知りたいと思ったら最適な一冊</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.mattari-benkyo-note.com/2023/07/03/llm_book_review/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2835</post-id>	</item>
		<item>
		<title>[勉強ノート] 「拡散モデル　データ生成技術の数理」 2.3 デノイジング拡散確率モデル</title>
		<link>https://www.mattari-benkyo-note.com/2023/03/16/diffusion_model_book_2_3/</link>
					<comments>https://www.mattari-benkyo-note.com/2023/03/16/diffusion_model_book_2_3/#respond</comments>
		
		<dc:creator><![CDATA[Shuji Suzuki (shu)]]></dc:creator>
		<pubDate>Wed, 15 Mar 2023 22:09:48 +0000</pubDate>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[pytorch]]></category>
		<category><![CDATA[拡散モデル]]></category>
		<category><![CDATA[書籍]]></category>
		<category><![CDATA[機械学習]]></category>
		<guid isPermaLink="false">https://www.mattari-benkyo-note.com/?p=2116</guid>

					<description><![CDATA[<p>先日紹介した「拡散モデル　データ生成技術の数理」をちゃんと理解するために数式を改めて追ったり、説明されているアルゴリズムを実装したりしています。 その第3弾として「2.3 デノイジング拡散確率モデル」で説明されているデノ [&#8230;]</p>
<p>The post <a href="https://www.mattari-benkyo-note.com/2023/03/16/diffusion_model_book_2_3/">[勉強ノート] 「拡散モデル　データ生成技術の数理」 2.3 デノイジング拡散確率モデル</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>先日紹介した「<a href="https://amzn.to/3SC3LMc" target="_blank" rel="noopener" title="拡散モデル　データ生成技術の数理">拡散モデル　データ生成技術の数理</a>」をちゃんと理解するために数式を改めて追ったり、説明されているアルゴリズムを実装したりしています。</p>



<p>その第3弾として「2.3 デノイジング拡散確率モデル」で説明されているデノイジング拡散確率モデル（DDPM）の学習とそれを使ったサンプリングについてPython(深層学習部分はPytorch)でコードを書いて試したのでそのまとめになります。今回の記事ではDDPMの細かい数式を説明すると記事の量がすごいことになりそうなので、重要な部分だけ説明していきます。</p>



<p>また、この本を買うか迷っている方は私が読んだ感想をこちらの記事に書いてますので参考にしてみてください。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-まったり勉強ノート wp-block-embed-まったり勉強ノート"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="a1lYO13NFR"><a href="https://www.mattari-benkyo-note.com/2023/02/23/diffusion_model_book_review/">[書評] 拡散モデル データ生成技術の数理 ー 目覚ましい画像生成の発展の裏側を知りたい人へ</a></blockquote><iframe loading="lazy" class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="&#8220;[書評] 拡散モデル データ生成技術の数理 ー 目覚ましい画像生成の発展の裏側を知りたい人へ&#8221; &#8212; まったり勉強ノート" src="https://www.mattari-benkyo-note.com/2023/02/23/diffusion_model_book_review/embed/#?secret=anhJj8X2Xf#?secret=a1lYO13NFR" data-secret="a1lYO13NFR" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<p>また、この記事で紹介したコードは以下にあげてありますので、コード全体を確認したい方はこちらをご覧ください。</p>



<p><a href="https://github.com/shu65/diffusion-model-book/blob/main/diffusion_model_book_2_3_ddpm.ipynb" target="_blank" rel="noopener" title="">https://github.com/shu65/diffusion-model-book/blob/main/diffusion_model_book_2_3_ddpm.ipynb</a></p>



<h2 class="wp-block-heading">デノイジング拡散確率モデルとは</h2>



<p>デノイジング拡散確率モデル（DDPM）はデータに対して徐々にノイズを加えていく拡散過程を逆向きに辿っていく逆拡散過程によってデータ生成を行います。図でみると分かりやすいと思うので拡散過程と逆拡散過程の関係図を以下に示します。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" src="https://www.mattari-benkyo-note.com/wp-content/uploads/2023/03/ddpm_flow-1-1024x627.png" alt="デノイジング拡散確率モデルの流れ" class="wp-image-2215" width="768" height="470" srcset="https://www.mattari-benkyo-note.com/wp-content/uploads/2023/03/ddpm_flow-1-1024x627.png 1024w, https://www.mattari-benkyo-note.com/wp-content/uploads/2023/03/ddpm_flow-1-300x184.png 300w, https://www.mattari-benkyo-note.com/wp-content/uploads/2023/03/ddpm_flow-1-768x470.png 768w, https://www.mattari-benkyo-note.com/wp-content/uploads/2023/03/ddpm_flow-1-1536x940.png 1536w, https://www.mattari-benkyo-note.com/wp-content/uploads/2023/03/ddpm_flow-1.png 1992w" sizes="auto, (max-width: 768px) 100vw, 768px" /><figcaption class="wp-element-caption">デノイジング拡散確率モデル</figcaption></figure></div>


<p>まずは上の図の上段の拡散過程についてです。ここでは\(\boldsymbol{x}_0\)がオリジナルのデータで、これに徐々にノイズを加えていき、\(\boldsymbol{x}_1, \boldsymbol{x}_2, \boldsymbol{x}_3, &#8230;, \boldsymbol{x}_T\)といいうデータを作っていきます。これを確率密度関数で表すと以下のようになります。</p>



<p>$$ \begin{align*}<br>q(\boldsymbol{x}_{1:T}|\boldsymbol{x}_0) :=&amp; \prod_{t=1}^T q(\boldsymbol{x}_t|\boldsymbol{x}_{t-1}) \tag{2.1.1} \\<br>q(\boldsymbol{x}_{t}|\boldsymbol{x}_{t-1}) :=&amp; \mathcal{N}(\boldsymbol{x}_t; \sqrt{\alpha_t}\boldsymbol{x}_{t-1}, \beta_t \boldsymbol{I}) \tag{2.1.2} \\<br>\end{align*} $$</p>



<p>ここで\(\beta_t\) は分散の大きさを制御するパラメータで、\(0&lt;\beta_1&lt;\beta_2&lt;&#8230;&lt;\beta_T&lt;1\)です。また、\(\alpha_t := 1 &#8211; \beta_t\) で、\(\alpha_t, \beta_t\)を合わせてノイズスケジュールと呼びます。</p>



<p>ここで、\(\mathcal{N}(\boldsymbol{x}_t; \sqrt{\alpha_t}\boldsymbol{x}_{t-1}, \beta_t \boldsymbol{I})\) について詳しく見ていきます。この拡散過程を繰り返していくと、\(\beta_t\) は徐々に大きくなります。結果として、ノイズ成分は大きくなっていきます。</p>



<p>一方、\(\beta_t\)が大きくなるということは\(\alpha_t := 1 &#8211; \beta_t\) なので\(\boldsymbol{x}_{t-1}\)の係数の\(\sqrt{\alpha_t}\)はどんどん小さくなっていきます。結果として、拡散過程を繰り返していくと任意の\(\boldsymbol{x}_{0}\)に対して、以下のような近似ができるようになります。</p>



<p>$$ \begin{align*}<br>q(\boldsymbol{x}_{T}|\boldsymbol{x}_{0}) :=&amp; \mathcal{N}(\boldsymbol{x}_T; 0,  \boldsymbol{I}) \tag{2.1.3} \\<br>\end{align*} $$</p>



<p>次に、図の下段の逆拡散過程です。これは\(\mathcal{N}(\boldsymbol{x}_T; 0,  \boldsymbol{I}) \)からスタートして拡散過程を逆向きに辿っていく処理になります。</p>



<p>この逆拡散過程の各ステップを正規分布で表し、この正規分布の平均と共分散行列を一つ前のステップの変数\(\boldsymbol{x}_{t}\)と時刻\(t\)を入力としてパラメータ\(\theta\)を使ったモデル(\(\mu_{\theta}(\boldsymbol{x}_{t}, t), \Sigma(\boldsymbol{x}_{t}, t))\))として表します。これを使うと逆拡散過程は以下のような式で表すことができます。</p>



<p>$$ \begin{align*}<br>p_{\theta}(\boldsymbol{x}_{0:T}) :=&amp; p(\boldsymbol{x}_T)\prod_{t=1}^T p_{\theta}(\boldsymbol{x}_t-1|\boldsymbol{x}_{t}) \tag{2.1.4} \\<br>p_{\theta}(\boldsymbol{x}_{t-1}|\boldsymbol{x}_{t}) :=&amp; \mathcal{N}(\boldsymbol{x}_{t-1}; \mu_{\theta}(\boldsymbol{x}_{t}, t), \Sigma_{\theta}(\boldsymbol{x}_{t}, t)) \tag{2.1.5} \\<br>p(\boldsymbol{x}_{T}) =&amp; \mathcal{N}(\boldsymbol{x}_T; 0,  \boldsymbol{I}) \tag{2.1.6}<br>\end{align*} $$</p>



<p>この\(\mu_{\theta}(\boldsymbol{x}_{t}, t), \Sigma_{\theta}(\boldsymbol{x}_{t}, t)\)は後ほど示す通りニューラルネットワークなどを使ってモデル化します。これによって逆拡散過程を実現しています。</p>



<p>では次から実際にこのモデルのパラメータ\(\theta\)の学習方法とそれを使ったサンプリングを見ていきます。</p>



<h2 class="wp-block-heading">デノイジング拡散確率モデルの学習</h2>



<p>デノイジング拡散確率モデルのモデルの学習方法の説明を本来はしたいのですが、この説明はすごく長いものになります。このため、詳しい説明は本を見ていただくとして、ここでは学習を回すうえで重要な変数と式に関する簡単な説明にとどめておきます。</p>



<p>まず、先ほど示した式(2.1.2)などを利用すると以下の式が導けます。</p>



<p>$$ \begin{align*}<br>q(\boldsymbol{x}_{t}|\boldsymbol{x}_{0}) :=&amp; \mathcal{N}(\boldsymbol{x}_t; \sqrt{\bar{\alpha}_t}\boldsymbol{x}_{0}, \bar{\beta}_t \boldsymbol{I}) \tag{2.1.7} \\<br>\bar{\alpha}_t := \prod_{s=1}^t \alpha_s \tag{2.1.8} \\<br>\bar{\beta}_t := 1 &#8211; \bar{\alpha}_t \tag{2.1.9} \\<br>\end{align*} $$</p>



<p>式(2.1.7)から式(2.1.9)の導出の証明に関しては本の式(2.1)の下に証明がありますので詳しく知りたい方はそちらをご覧ください。</p>



<p>これにより、わざわざ式(2.1.2)に従って、\(\boldsymbol{x}_{0}\)から徐々に\(t\)を大きくして\(\boldsymbol{x}_{t}\)を生成しなくても、式(2.1.7)を使うことで正規分布のサンプリングを１度すれば任意の\(t\)の\(\boldsymbol{x}_{t}\)のデータを生成できることになります。学習ではこれを利用して高速にランダムな\(t\)のデータを生成して学習に利用します。</p>



<p>次にデノイジング拡散確率モデルの学習で用いるロス関数についてです。これに関しては前の記事でも紹介したスコアベースモデルと同じようにデノイジングスコアマッチングを利用します。また、ロス関数の導出は先ほど説明した通り、ちゃんと説明しようとするとすごく長いので本で示されている最終的な結果を以下に示します。</p>



<p>$$ \begin{align*}<br>L_{\gamma}(\theta) =&amp; \sum_{t=1}^T w_t E_{\boldsymbol{x}_0, \epsilon} \left\{ \left\| \epsilon &#8211; \epsilon_{\theta}(\sqrt{\bar{\alpha}_t}\boldsymbol{x}_0 + \sqrt{\bar{\beta}_t}\epsilon, t) \right\|^2 \right\} \tag{2.1.10} \\<br>\gamma =&amp; \left\{ w_1, w_2, &#8230;, w_T \right\} \tag{2.1.11} <br>\end{align*} $$</p>



<p>この式の\(w_t\)に関しては本によると\(w_t = 1\) がよくつかわれるとのことなので、このあとの実装のコードでも\(w_t = 1\)としています。</p>



<p>ここで、式の導出を省略して関係が分かりにくくなっていため、逆拡散過程の説明で出てきた式(2.1.5)の中の\(\mu_{\theta}(\boldsymbol{x}_{t}, t), \Sigma_{\theta}(\boldsymbol{x}_{t}, t)\)と式(2.1.10)の中で出てきている\(\epsilon_{\theta}(\sqrt{\bar{\alpha}_t}\boldsymbol{x}_0 + \sqrt{\bar{\beta}_t}\epsilon, t)\) との関係を説明しておきます。</p>



<p>逆拡散過程を行う上で\(\mu_{\theta}(\boldsymbol{x}_{t}, t), \Sigma_{\theta}(\boldsymbol{x}_{t}, t)\)のパラメータ\(\theta\)を学習する必要があります。ここで、本の説明によると\(\Sigma_{\theta}(\boldsymbol{x}_{t}, t)\)に関してはパラメータ\(\theta\)に依存しない固定の\(\Sigma_{\theta}(\boldsymbol{x}_{t}, t)) = \sigma_t^2 \boldsymbol{I}\)を使うことが多いそうです。先ほど示したロス関数も\(\Sigma_{\theta}(\boldsymbol{x}_{t}, t)) = \sigma_t^2 \boldsymbol{I}\)として式変形しています。</p>



<p>次に\(\mu_{\theta}(\boldsymbol{x}_{t}, t)\)の部分です。こちらはロス関数の導出の過程で結局は\(t\)の時点で加えられたノイズを予測できるモデルに置き換えることができます。このため、\(\mu_{\theta}(\boldsymbol{x}_{t}, t)\)ではなく、ノイズを予測する\(\epsilon_{\theta}(\boldsymbol{x}_{t}, t)\)がロス関数の中で登場しています。</p>



<p>また、\(\boldsymbol{x}_{t}\) は式(2.1.7)から以下のようになります。</p>



<p>$$ \begin{align*}<br>\boldsymbol{x}_{t} =&amp; \sqrt{\bar{\alpha}_t}\boldsymbol{x}_0 + \sqrt{\bar{\beta}_t}\epsilon \\<br>\epsilon \sim&amp; \mathcal{N}(0, \boldsymbol{I}) \\<br>\tag{2.1.12}<br>\end{align*} $$</p>



<p>本のほうには丁寧にこのロス関数の導出が書かれているので詳細を知りたい方はぜひ本を読んでください。</p>



<p>この式(2.1.10)をロス関数として利用したデノイジング拡散確率モデルの学習の疑似コードは以下の通りです。(「拡散モデル　データ生成技術の数理」Algorithm 2.2の引用)</p>



<ol class="wp-block-list">
<li>repeat</li>



<li>\(\quad \boldsymbol{x}_0 \sim p_{\text{data}}(\boldsymbol{x}_0)\)</li>



<li>\(\quad t \sim \text{Uniform}({1, &#8230;, T})\)</li>



<li>\(\quad \epsilon \sim \mathcal{N}(0, \boldsymbol{I})\)</li>



<li>\(\quad g := \nabla_{\theta} w_t \left\| \epsilon &#8211; \epsilon_{\theta}(\sqrt{\bar{\alpha_t}} \boldsymbol{x}_0 + \sqrt{\bar{\beta_{t}}} \epsilon, t)\right\|^2 \)</li>



<li>\(\quad \theta := \theta &#8211; \alpha g \)</li>



<li>until converged</li>
</ol>



<p>ここで本では特に説明されてないですが、式(2.1.10)の最初の\(\sum_{t=1}^T\)の部分は少し変更して、\(t=1\)から\(t=T\)ランダムに\(t\)を選んで使用するように変更されています。</p>



<p>このアルゴリズムでは、まず最初にデータ\(\boldsymbol{x}_0 \)と\(t\)を選び、それらを用いて式(2.1.10)のロス関数を計算します。その後、勾配を計算してパラメータのアップデートをするということを繰り返します。6行目の勾配を使ったパラメータのアップデートは深層学習の基本的なパラメータ更新の確率的勾配降下法を利用したコードになっています。この部分は確率的勾配降下法以外のもの、例えばAdamなどでも問題ありません。</p>



<p>この疑似コードを基にPyTorchで実装するとこのようになります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="train_ddpm.py" data-lang="Python"><code>batch_size = 512
n_steps = 100000

dataloader = torch.utils.data.DataLoader(dataset, batch_size=512, shuffle=True, num_workers=0)
dataloader_iter = iter(dataloader)

model = Model().to(device)

optimizer = torch.optim.Adam(model.parameters())
lr_scheduler = torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr=0.001, total_steps=n_steps)
loss_func = torch.nn.MSELoss(reduction=&quot;none&quot;)

for i in range(n_steps):
  try:
    x0 = next(dataloader_iter)[0]
  except StopIteration:
    dataloader_iter = iter(dataloader)
    x0 = next(dataloader_iter)[0]
  x0 = x0.to(device)

  optimizer.zero_grad()

  noise = torch.randn_like(x0)
  t = torch.randint(0, len(x0), (x0.shape[0],), device=device)
  x = torch.sqrt(alpha_bars[t])[:, None] * x0 + torch.sqrt(beta_bars[t])[:, None] * noise
  noise_pred = model(x, t)
  w = 1.0
  losses = w * loss_func(noise_pred, noise)
  loss = losses.mean()

  loss.backward()
  optimizer.step()
  lr_scheduler.step()</code></pre></div>



<p>基本的には疑似コードとほぼ同じですが、ロス関数周りで違うところがあるので、簡単に説明します。まず、深層学習なのでミニバッチを使った学習に置き換えています。このため、\(\boldsymbol{x}_0 \)も一つだけでなく、バッチサイズ分ランダムに選んでいます。これに伴って、\(t\)もバッチサイズ分ランダムに選んで利用します。そして、最終的には各データ点のロス関数の値の平均を計算して勾配を計算するという形に置き換えています。</p>



<p>また、パラメータの最適化の部分は確率勾配降下法ではなくAdamを利用しています。</p>



<h2 class="wp-block-heading">デノイジング拡散確率モデルを使ったサンプリング</h2>



<p>ここから先ほど紹介した方法で学習したモデルを利用してどのようにサンプリングしていくか、について説明します。</p>



<p>基本的には式(2.1.5)に従って逆拡散過程のステップを繰り返すことで実現します。</p>



<p>ここで、説明を省略してしまいましたが、式(2.1.5)の中にでてくる\(\mu_{\theta}(\boldsymbol{x}_{t}, t)\)を学習したノイズを予測するモデル\(\epsilon_{\theta}(\boldsymbol{x}_{t}, t)\)を使って表すと以下のようになります。</p>



<p>$$ \begin{align*}<br>\mu_{\theta}(\boldsymbol{x}_{t}, t) =&amp; \frac{1}{\sqrt{\bar{\alpha}}} \left( \boldsymbol{x}_{t} &#8211; \frac{\beta_t}{\sqrt{\bar{\beta_t}}} \epsilon_{\theta}(\boldsymbol{x}_{t}, t) \right) \tag{2.1.13}<br>\end{align*} $$</p>



<p>また、一方、\(\Sigma_{\theta}(\boldsymbol{x}_{t}, t))\)は先ほど説明した通り、\(\Sigma_{\theta}(\boldsymbol{x}_{t}, t)) = \sigma_t^2 \boldsymbol{I}\)です。</p>



<p>これらと式(2.1.5)に従ったサンプリングの疑似コードは以下の通りです。(「拡散モデル　データ生成技術の数理」Algorithm 2.3の引用)</p>



<ol class="wp-block-list">
<li>\(\boldsymbol{x}_T \sim \mathcal{N}(0, \boldsymbol{I})\)</li>



<li>for \(t=T, &#8230;, 1\) do</li>



<li>\(\quad \boldsymbol{u}_t \sim \mathcal{N}(0, \boldsymbol{I})\)</li>



<li>\(\quad\) if \(t=1\) then \(\boldsymbol{u}_t := 0\)</li>



<li>\(\quad \boldsymbol{x}_{t-1} := \frac{1}{\sqrt{\bar{\alpha}}} \left\{ \boldsymbol{x}_{t} &#8211; \frac{\beta_t}{\sqrt{\bar{\beta_t}}} \epsilon_{\theta}(\boldsymbol{x}_{t}, t) \right\} + \sigma_t  \boldsymbol{u}_t \)</li>



<li>end for</li>



<li>return \(\boldsymbol{x}_0\)</li>
</ol>



<p>基本的には徐々にノイズを取り除くことで目的のデータをサンプリングするという流れです。</p>



<p>PyTorchのコードとしては以下のようになります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="ddpm_sample" data-lang="Python"><code>def ddpm_sample(n_samples, model, alphas, betas, beta_bars):
    xt = torch.randn(n_samples, 2)
    T = len(alphas)
    for t in range(T -1, -1, -1):
      print(f&quot;t:{t}&quot;)
      ut = torch.randn(n_samples, 2)
      if t == 0:
        ut[:, :] = 0.0
      with torch.no_grad():
        noise_pred = model(xt, t*torch.ones(n_samples, dtype=xt.dtype))
        sigma_t = torch.sqrt(betas[t])
        xt = 1 / torch.sqrt(alphas[t]) * (xt - betas[t]/torch.sqrt(beta_bars[t])*noise_pred) + sigma_t*ut
    return xt</code></pre></div>



<p>ここで、<code>n_samples</code>がサンプリングするサンプル数、<code>model</code>が\(\epsilon_{\theta}(\boldsymbol{x}_{t}, t)\)、<code>alphas</code>、<code>betas</code>, <code>beta_bars</code>がそれぞれ\(\alpha_t, \beta_t, \bar{\beta}_t\) のリストです。</p>



<h2 class="wp-block-heading">実行例</h2>



<p>先ほど紹介したPythonコードを実際に動かした例も示しておきます。参考例として入力となる\(\boldsymbol{x}\)のサンプリングする分布の確率密度関数は以下のように平均が違うガウス分布二つの混合分布とし、サンプリングしたデータを正規化して使用します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="generate_dataset" data-lang="Python"><code>n_samples = int(1e6)
sigma = 0.01

dist0 = torch.distributions.MultivariateNormal(torch.tensor([-2, -2], dtype=torch.float).to(device), sigma*torch.eye(2, dtype=torch.float).to(device))
samples0 = dist0.sample(torch.Size([n_samples//2]))
    
dist1 = torch.distributions.MultivariateNormal(torch.tensor([2, 2], dtype=torch.float).to(device), sigma*torch.eye(2, dtype=torch.float).to(device))
samples1 = dist1.sample(torch.Size([n_samples//2]))
samples = torch.vstack((samples0, samples1))

mean = torch.mean(samples, dim=0)
std = torch.std(samples, dim=0)

normalized_samples = (samples - mean[None, :])/std[None, :]</code></pre></div>



<p>使用する\(\boldsymbol{x}\)を2Dのヒストグラムで可視化すると以下のようになります。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="266" height="264" src="https://www.mattari-benkyo-note.com/wp-content/uploads/2023/03/sample_density-1.png" alt="使用するデータの可視化結果" class="wp-image-2211" srcset="https://www.mattari-benkyo-note.com/wp-content/uploads/2023/03/sample_density-1.png 266w, https://www.mattari-benkyo-note.com/wp-content/uploads/2023/03/sample_density-1-150x150.png 150w" sizes="auto, (max-width: 266px) 100vw, 266px" /><figcaption class="wp-element-caption">使用するデータの可視化結果</figcaption></figure></div>


<p>このデータを再現できるようにデノイジング拡散確率モデルを学習します。コードとしては先ほど示した通りです。</p>



<p>学習が終わったら次は以下のようにサンプリングを行います。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="run_ddpm_sample" data-lang="Python"><code>samples_pred = ddpm_sample(n_samples=100000, model=model, alphas=alphas, betas=betas, beta_bars=beta_bars)</code></pre></div>



<p>サンプリングされたデータの2Dのヒストグラムは以下の通りです。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="266" height="264" src="https://www.mattari-benkyo-note.com/wp-content/uploads/2023/03/predicted_sample_density-3.png" alt="デノイジング拡散確率モデルによるサンプリングデータの可視化結果" class="wp-image-2214" srcset="https://www.mattari-benkyo-note.com/wp-content/uploads/2023/03/predicted_sample_density-3.png 266w, https://www.mattari-benkyo-note.com/wp-content/uploads/2023/03/predicted_sample_density-3-150x150.png 150w" sizes="auto, (max-width: 266px) 100vw, 266px" /><figcaption class="wp-element-caption">デノイジング拡散確率モデルによるサンプリングデータの可視化結果</figcaption></figure></div>


<p>可視化結果をみると元の分布の平均の近くにデータが集中しているので、うまくいっていると考えられます。</p>



<h2 class="wp-block-heading">終わりに</h2>



<p>今回は「<a href="https://amzn.to/3SC3LMc" target="_blank" rel="noopener" title="拡散モデル　データ生成技術の数理">拡散モデル　データ生成技術の数理</a>」の2.3のデノイジング拡散確率モデルの簡単な説明とコードを書いたのでそのまとめの記事になります。先日スコアベースモデルのコードを用意したことで、そのコードを参考に今回のデノイジング拡散確率モデルをすぐに作ることができたのですが、説明はすごい大変でした。</p>



<p>スコアベースモデルのほうも気になるという方はこちらをご覧ください。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-まったり勉強ノート wp-block-embed-まったり勉強ノート"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="QbbiRh4C0Y"><a href="https://www.mattari-benkyo-note.com/2023/03/08/diffusion_model_book_2_2/">[勉強ノート] 「拡散モデル　データ生成技術の数理」 2.2 スコアベースモデル</a></blockquote><iframe loading="lazy" class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="&#8220;[勉強ノート] 「拡散モデル　データ生成技術の数理」 2.2 スコアベースモデル&#8221; &#8212; まったり勉強ノート" src="https://www.mattari-benkyo-note.com/2023/03/08/diffusion_model_book_2_2/embed/#?secret=J4EXuySmX8#?secret=QbbiRh4C0Y" data-secret="QbbiRh4C0Y" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<p>今後、3章で紹介されている連続時間化拡散モデルのVE-SDEのほうも紹介予定です。コードは昨日できました。ただ、思ったよりも説明が大変そうなので、記事を書くのに時間がかかると思います。</p>



<p>この記事が少しでもみなさんの理解の助けになれば幸いです。</p>



<h2 class="wp-block-heading">参考文献</h2>



<ol class="wp-block-list">
<li>Ho, J., Jain, A., &amp; Abbeel, P. (2020). Denoising Diffusion Probabilistic Models. ArXiv, abs/2006.11239.</li>



<li><a href="https://github.com/hojonathanho/diffusion" target="_blank" rel="noopener" title="">https://github.com/hojonathanho/diffusion</a></li>
</ol><p>The post <a href="https://www.mattari-benkyo-note.com/2023/03/16/diffusion_model_book_2_3/">[勉強ノート] 「拡散モデル　データ生成技術の数理」 2.3 デノイジング拡散確率モデル</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.mattari-benkyo-note.com/2023/03/16/diffusion_model_book_2_3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2116</post-id>	</item>
		<item>
		<title>[勉強ノート] 「拡散モデル　データ生成技術の数理」 2.2 スコアベースモデル</title>
		<link>https://www.mattari-benkyo-note.com/2023/03/08/diffusion_model_book_2_2/</link>
					<comments>https://www.mattari-benkyo-note.com/2023/03/08/diffusion_model_book_2_2/#respond</comments>
		
		<dc:creator><![CDATA[Shuji Suzuki (shu)]]></dc:creator>
		<pubDate>Tue, 07 Mar 2023 21:33:32 +0000</pubDate>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[pytorch]]></category>
		<category><![CDATA[SBM]]></category>
		<category><![CDATA[スコアベースモデル]]></category>
		<category><![CDATA[拡散モデル]]></category>
		<category><![CDATA[書籍]]></category>
		<category><![CDATA[機械学習]]></category>
		<guid isPermaLink="false">https://www.mattari-benkyo-note.com/?p=1932</guid>

					<description><![CDATA[<p>先日紹介した「拡散モデル　データ生成技術の数理」をちゃんと理解するために数式を改めて追ったり、説明されているアルゴリズムを実装したりしています。 その第2弾として「2.2 スコアベースモデル」で説明されているスコアベース [&#8230;]</p>
<p>The post <a href="https://www.mattari-benkyo-note.com/2023/03/08/diffusion_model_book_2_2/">[勉強ノート] 「拡散モデル　データ生成技術の数理」 2.2 スコアベースモデル</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>先日紹介した「<a href="https://amzn.to/3SC3LMc" target="_blank" rel="noopener" title="拡散モデル　データ生成技術の数理">拡散モデル　データ生成技術の数理</a>」をちゃんと理解するために数式を改めて追ったり、説明されているアルゴリズムを実装したりしています。</p>



<p>その第2弾として「2.2 スコアベースモデル」で説明されているスコアベースモデルの学習とそれを使ったサンプリングについてPython(深層学習部分はPytorch)でコードを書いて試したのでそのまとめになります。</p>



<p>また、この本を買うか迷っている方は私が読んだ感想をこちらの記事に書いてますので参考にしてみてください。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-まったり勉強ノート wp-block-embed-まったり勉強ノート"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="feZfZwZCVZ"><a href="https://www.mattari-benkyo-note.com/2023/02/23/diffusion_model_book_review/">[書評] 拡散モデル データ生成技術の数理 ー 目覚ましい画像生成の発展の裏側を知りたい人へ</a></blockquote><iframe loading="lazy" class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="&#8220;[書評] 拡散モデル データ生成技術の数理 ー 目覚ましい画像生成の発展の裏側を知りたい人へ&#8221; &#8212; まったり勉強ノート" src="https://www.mattari-benkyo-note.com/2023/02/23/diffusion_model_book_review/embed/#?secret=rS3Hmaks6Y#?secret=feZfZwZCVZ" data-secret="feZfZwZCVZ" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div><figcaption class="wp-element-caption">[書評] 拡散モデル データ生成技術の数理 ー 目覚ましい画像生成の発展の裏側を知りたい人へ</figcaption></figure>



<p>また、この記事で紹介したコードは以下にあげてありますので、コード全体を確認したい方はこちらをご覧ください。</p>



<p><a href="https://github.com/shu65/diffusion-model-book/blob/main/diffusion_model_book_2_2_score_based_model.ipynb" target="_blank" rel="noopener" title="">https://github.com/shu65/diffusion-model-book/blob/main/diffusion_model_book_2_2_score_based_model.ipynb</a></p>



<h2 class="wp-block-heading">スコアベースモデルとは</h2>



<p>１章で紹介されているデノイジングスコアマッチングは以下の２つの問題点があると本では紹介されています。</p>



<ol class="wp-block-list">
<li>デノイジングスコアマッチングで推定されたスコア関数はデータ分布の密度が小さい領域で不正確</li>



<li>データ分布が多峰性を持つ場合、あるモード（確率が大きい領域）から他のモードに移る際、確率が小さい領域を通過するために非常に多くのステップを必要とする</li>
</ol>



<p>これらの問題を解決するためにスコアベースモデル（SBM）[1, 2] では複数の異なる強度のノイズによって攪乱した攪乱後分布を用意して、それらの攪乱後分布上のスコアを求めるようにしています。</p>



<h2 class="wp-block-heading">スコアベースモデルの学習</h2>



<p>スコア関数 \(s_{\theta}(\boldsymbol{x}, \sigma_t)\) を学習する際は以下のロス関数を使います。</p>



<p>$$ \begin{align*}<br>L_{\text{SBM}}(\theta) := \sum_{t=1}^T w_t E_{p_{\sigma_t}}(\tilde{\boldsymbol{x}}) \left\{ \left\| \nabla_{\tilde{\boldsymbol{x}}} \log p_{\sigma_t}(\tilde{\boldsymbol{x}}) &#8211; s_{\theta}(\tilde{\boldsymbol{x}}, \sigma_t) \right\|^2 \right\} \tag{2.2.1}<br>\end{align*} $$</p>



<p>ここで\(\sigma_t \) はノイズの強さを表す変数で\( \sigma_{min} = \sigma_1 &lt; \sigma_2 &lt;&#8230; &lt; \sigma_T = \sigma_{max}\)の合計\(T\)個をスコアベースモデルでは利用します。そして、\(p_{\sigma_t}(\tilde{\boldsymbol{x}}) \) \(x\)は\(x\)の分布\(p(x)\)を\(\sigma_t\)の強さで攪乱したあとの分布を表しています。</p>



<p>この式(2.2.1)を本の1.5.5の「デノイジングスコアマッチング」で説明されている通り、デノイジングスコアマッチングを使って式を書き換えると以下のようになります。</p>



<p>$$ \begin{align*}<br>L_{\text{DSM-SBM}}(\theta) := \sum_{t=1}^T w_t E_{\boldsymbol{x} \sim p_{data}(\boldsymbol{x}),\tilde{\boldsymbol{x}} \sim \mathcal{N}(\boldsymbol{x}, \sigma_t^2\boldsymbol{I})} \left\{ \left\| \frac{\boldsymbol{x} &#8211; \tilde{\boldsymbol{x}}}{\sigma_t^2} &#8211; s_{\theta}(\tilde{\boldsymbol{x}}, \sigma_t) \right\|^2 \right\} \tag{2.2.2}<br>\end{align*} $$</p>



<p>詳細は本にわかりやすくかいてあるので本を参照してください。</p>



<p>ここで本の式(1.9)のデノイジングスコアマッチングの式において最初に\(1/2\)があるのに式(2.2.2)ではそれが省略されています。これに関して本にはちゃんと書いてない気がしますが、おそらくこれは\(w_t\)の中に\(1/2\)が含まれているから、もしくは\(1/2\)は定数であり、最適化の際にパラメータが移動する方向は\(1/2\)のありなしで変わらないということで省略しているのではないかと思っています。</p>



<p>ここから２章にはちゃんと書いてないですが、Pythonで実装するためにさらに式変形していきます。\(\tilde{\boldsymbol{x}} \sim \mathcal{N}(\boldsymbol{x}, \sigma_t^2\boldsymbol{I})\)なので、\(\tilde{\boldsymbol{x}}\)を\(\epsilon \sim \mathcal{N}(0, \sigma_t^2 \boldsymbol{I})\)を使って表すと以下のようになります。</p>



<p>$$ \begin{align*}<br>\tilde{\boldsymbol{x}} = \boldsymbol{x} + \epsilon \tag{2.2.3}<br>\end{align*} $$</p>



<p>この式(2.2.3)を使って式(2.2.2)を式変形すると以下の通りです。</p>



<p>$$ \begin{align*}<br>L_{\text{DSM-SBM}}(\theta) :=&amp; \sum_{t=1}^T w_t E_{\boldsymbol{x} \sim p_{data}(\boldsymbol{x}),\tilde{\boldsymbol{x}} \sim \mathcal{N}(\boldsymbol{x}, \sigma_t^2\boldsymbol{I})} \left\{ \left\| \frac{\boldsymbol{x} &#8211; \tilde{\boldsymbol{x}}}{\sigma_t^2} &#8211; s_{\theta}(\tilde{\boldsymbol{x}}, \sigma_t) \right\|^2 \right\} \\<br>=&amp; \sum_{t=1}^T w_t E_{\boldsymbol{x} \sim p_{data}(\boldsymbol{x}),\epsilon \sim \mathcal{N}(\boldsymbol{x}, \sigma_t \boldsymbol{I})} \left\{ \left\| \frac{-\epsilon}{\sigma_t^2} &#8211; s_{\theta}(\tilde{\boldsymbol{x}}, \sigma_t) \right\|^2 \right\} \tag{2.2.4}<br>\end{align*} $$</p>



<p>この式を見たときに\(t=1\)から\(t=T\)までの和をとっている部分、\(T\)のサイズによっては計算量がすごいことにならないか？ということを思いました。このため、何か実装するときに工夫があるのかも？ということで[2]著者実装である[3]を見にいきました。すると2023/03/03時点では\(t=1\)から\(t=T\)ランダムに\(t\)を選び、その平均をとるということをしていました。</p>



<p>Pythonのコードのほうが分かりやすいと思うので、以下にPythonのコードも示しておきます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="dsm_loss" data-lang="Python"><code>def dsm_loss(score_model, samples, sigmas):
  t = torch.randint(0, len(sigmas), (samples.shape[0],), device=sigmas.device)
  used_sigmas = sigmas[t].view(samples.shape[0], *([1] * len(samples.shape[1:])))
  noise = torch.randn_like(samples) * used_sigmas
  perturbed_samples = samples + noise
  target = - 1 / (used_sigmas ** 2) * noise
  scores = score_model(perturbed_samples, used_sigmas)
  target = target.view(target.shape[0], -1)
  scores = scores.view(scores.shape[0], -1)
  w = used_sigmas.squeeze(-1) ** 2
  loss = ((scores - target) ** 2).sum(dim=-1) * w
  return loss.mean()</code></pre></div>



<p>ここで<code>score_model</code>がスコア関数 \(s_{\theta}(\boldsymbol{x}, \sigma_t )\) 、<code>samples</code>が\(\boldsymbol{x}\)、<code>sigmas</code>が\(\{\sigma_1,&#8230;,\sigma_T\}\)の配列となっています。また、\(w_t\)は本にならって\(w_t=\sigma_t^2\)を使っています。</p>



<p>この関数では最初にランダムに\(t\)を選び、それに従ってノイズを生成し、\(\tilde{\boldsymbol{x}}\)を作ります。その後、スコア関数の<code>score_model</code>を使ってスコアを計算し、式(2.2.4)を使ってロス関数を計算します。</p>



<p>このロス関数を使ってスコア関数のパラメータを学習していきます。</p>



<p>ここで１つ、スコア関数のモデルに関して注意点があります。スコア関数は\(s_{\theta}(\boldsymbol{x}, \sigma_t) \)は\(\boldsymbol{x}\)だけでなく\(\sigma_t\)も引数にとります。このため、モデルの中でどうにかして\(\sigma_t \)と\(\boldsymbol{x}\)の入力を組み合わせる必要があります。これに関して今回のコードでは[3]の実装にならって、以下のようにして\(\boldsymbol{x}\)だけを入力として受け取るスコア関数\(s_{\theta}^{\prime}(\boldsymbol{x})\)の出力を\(\sigma_t\)で割るという形にしています。</p>



<p>$$ \begin{align*}<br>s_{\theta}(\boldsymbol{x}, \sigma_t) = s_{\theta}^{\prime}(\boldsymbol{x}) / \sigma_t \tag{2.2.5}<br>\end{align*} $$</p>



<p>また、後ほど示しますが、今回は２つのガウス分布の混合分布を入力とします。この分布はシンプルな分布なため、今回は簡単なMLPをスコア関数のモデル使用します。コードとては以下のようになります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="score_model" data-lang="Python"><code>import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F

class ScoreModel(nn.Module):
  def __init__(self, n_channels=2):
    super(ScoreModel, self).__init__()

    self.model = nn.Sequential(
        nn.Linear(n_channels, 2*n_channels),
        nn.ELU(),
        nn.Linear(2*n_channels, 16*n_channels),
        nn.ELU(),
        nn.Linear(16*n_channels, 2*n_channels),
        nn.ELU(),
        nn.Linear(2*n_channels, n_channels),
    )

  def forward(self, x, sigma):
    y = self.model(x)
    return y/sigma</code></pre></div>



<h2 class="wp-block-heading">スコアベースモデルを使ったサンプリング</h2>



<p>ここから学習済みのスコア関数\(s_{\theta}(\boldsymbol{x}, \sigma_t) \)を使ったサンプリングについて説明していきます。</p>



<p>スコアベースモデルを使ったサンプリング１章で紹介されたランジュバン・モンテカルロ法をベースにしています。ランジュバン・モンテカルロ法の部分についてはこちらに解説しています。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-まったり勉強ノート wp-block-embed-まったり勉強ノート"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="fM7uHxbfRU"><a href="https://www.mattari-benkyo-note.com/2023/03/03/diffusion_model_book_1_5_1/">[勉強ノート] 「拡散モデル　データ生成技術の数理」 1.5.1 ランジュバン・モンテカルロ法</a></blockquote><iframe loading="lazy" class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="&#8220;[勉強ノート] 「拡散モデル　データ生成技術の数理」 1.5.1 ランジュバン・モンテカルロ法&#8221; &#8212; まったり勉強ノート" src="https://www.mattari-benkyo-note.com/2023/03/03/diffusion_model_book_1_5_1/embed/#?secret=oaLMCcsv0l#?secret=fM7uHxbfRU" data-secret="fM7uHxbfRU" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<p>詳細は上の記事にかいてありますが、ランジュバン・モンテカルロ法は最初、ランダムに\(\boldsymbol{x}_0\)を生成後、以下のランジュバン・モンテカルロ法の更新則を\(K\)回繰り返すことで\(p(\boldsymbol{x})\)からサンプリングしたようなデータを作ります。</p>



<p>$$ \begin{align*}<br>\boldsymbol{x}_k := \boldsymbol{x}_{k-1} + \alpha \nabla_\boldsymbol{x} \log p(\boldsymbol{x}_{k-1}) + \sqrt{2\alpha}\boldsymbol{u}_k \tag{2.2.6}<br>\end{align*} $$</p>



<p>スコアベースモデルのサンプリングでは更新則のスコア（\(\nabla_\boldsymbol{x} \log p(\boldsymbol{x}_{k-1})\)）を学習したスコア関数に置き換えた以下の更新則を利用します。</p>



<p>$$ \begin{align*}<br>\boldsymbol{x}_{t, k} := \boldsymbol{x}_{t, k-1} + \alpha_t s_{\theta}(\boldsymbol{x}_{t, k-1}, \sigma_t)+ \sqrt{2\alpha_t}\boldsymbol{u}_k \tag{2.2.7}<br>\end{align*} $$</p>



<p>この更新則を用いたスコアベースモデルのサンプリングの疑似コードは以下の通りです。(「拡散モデル　データ生成技術の数理」Algorithm 2.1の引用)</p>



<ol class="wp-block-list">
<li>\(\boldsymbol{x}_0\)を初期化(\(\boldsymbol{x}_0 \sim \mathcal{N}(0, \sigma_T^2 \boldsymbol{I})\))</li>



<li>for \(t=1,&#8230;,T\) do</li>



<li>\(\quad \alpha_t := \alpha \sigma_t^2\/\sigma_T^2)\</li>



<li>\(\quad\) for \(k=1,&#8230;,K\) do</li>



<li>\(\qquad \boldsymbol{u}_k \sim \mathcal{N}(0, \boldsymbol{I})\)</li>



<li>\(\qquad\) if \(t=1\) and \(k=K\) then \(\boldsymbol{u}_k := 0\)</li>



<li>\(\qquad \boldsymbol{x}_{t, k} := \boldsymbol{x}_{t, k-1} + \alpha_t s_{\theta}(\boldsymbol{x}_{t, k-1}, \sigma_t)+ \sqrt{2\alpha_t}\boldsymbol{u}_k \)</li>



<li>\(\quad\) end for</li>



<li>\(\quad \boldsymbol{x}_{t-1, 0} := \boldsymbol{x}_{t, K}\) </li>



<li>end for</li>



<li>return \(\boldsymbol{x}_{0, 0}\)</li>
</ol>



<p>ここで\(\alpha\)はステップ幅のスケール、\(K\)はステップ回数です。アルゴリズムを見て分かる通り、ノイズの強度を変えながらランジュバン・モンテカルロ法を使って少しずつ\(\boldsymbol{x}_{t, k}\)を変化させています。また、７行目にある通り、各ノイズの強度の最後のステップではデノイジングのみを行うことでサンプリングの品質を向上させています。</p>



<p>この疑似コードをPythonのコードにするとこのようになります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="sbm_sampling" data-lang="Python"><code>def sbm_sample(n_samples, score_model, sigmas, alpha=0.1):
    sigma_T = sigmas[-1]
    x_0 = torch.randn(n_samples, 2)*sigma_T
    x_tk = x_0
    K = 200
    for t in range(len(sigmas) -1, -1, -1):
      sigma_t = sigmas[t]
      alpha_t = alpha*(sigma_t**2)/(sigma_T**2)
      print(f&quot;t:{t}, sigma_t:{sigma_t}, alpha_t:{alpha_t}&quot;)
      for k in range(K+1):
        u_k = torch.randn(n_samples, 2)
        if (k == K) and t == 0:
          u_k[:, :] = 0.0
        with torch.no_grad():
          score = score_model(x_tk, sigma_t)
          x_tk = x_tk + alpha_t * score + np.sqrt(2 * alpha_t) * u_k
    return x_tk</code></pre></div>



<p><code>n_samples</code>が生成するサンプル数、<code>score_model</code>がスコア関数、<code>sigmas</code>がノイズ強度の配列、<code>alpha</code>がステップ幅のスケールになっています。</p>



<h2 class="wp-block-heading">実行例</h2>



<p>先ほど紹介したPythonコードを実際に動かした例も示しておきます。参考例として入力となる\(\boldsymbol{x}\)のサンプリングする分布の確率密度関数は以下のように平均が違うガウス分布二つの混合分布とし、サンプリングしたデータを正規化して使用します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="generate_dataset" data-lang="Python"><code>n_samples = int(1e6)
sigma = 0.01

dist0 = torch.distributions.MultivariateNormal(torch.tensor([-2, -2], dtype=torch.float).to(device), sigma*torch.eye(2, dtype=torch.float).to(device))
samples0 = dist0.sample(torch.Size([n_samples//2]))
    
dist1 = torch.distributions.MultivariateNormal(torch.tensor([2, 2], dtype=torch.float).to(device), sigma*torch.eye(2, dtype=torch.float).to(device))
samples1 = dist1.sample(torch.Size([n_samples//2]))
samples = torch.vstack((samples0, samples1))

mean = torch.mean(samples, dim=0)
std = torch.std(samples, dim=0)

normalized_samples = (samples - mean[None, :])/std[None, :]</code></pre></div>



<p>使用する\(\boldsymbol{x}\)を2Dのヒストグラムで可視化すると以下のようになります。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" src="https://www.mattari-benkyo-note.com/wp-content/uploads/2023/03/sample_density.png" alt="使用するデータの可視化結果" class="wp-image-2091" width="266" height="264" srcset="https://www.mattari-benkyo-note.com/wp-content/uploads/2023/03/sample_density.png 266w, https://www.mattari-benkyo-note.com/wp-content/uploads/2023/03/sample_density-150x150.png 150w" sizes="auto, (max-width: 266px) 100vw, 266px" /><figcaption class="wp-element-caption">使用するデータの可視化結果</figcaption></figure></div>


<p>このデータを再現できるようにスコア関数を学習します。学習コードは以下の通りです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="train" data-lang="Python"><code>import torch

batch_size = 512
n_steps = 100000

dataset = torch.utils.data.TensorDataset((normalized_samples))
dataloader = torch.utils.data.DataLoader(dataset, batch_size=512, shuffle=True, num_workers=0)
dataloader_iter = iter(dataloader)

score_model = ScoreModel().to(device)

optimizer = torch.optim.Adam(score_model.parameters())
lr_scheduler = torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr=0.001, total_steps=n_steps)

for i in range(n_steps):
  try:
    x = next(dataloader_iter)[0]
  except StopIteration:
    dataloader_iter = iter(dataloader)
    x = next(dataloader_iter)[0]
  x = x.to(device)

  optimizer.zero_grad()
  loss = dsm_loss(score_model, x, sigmas)
  loss.backward()
  optimizer.step()
  lr_scheduler.step()
  if (i % 1000) == 0:
    print(f&quot;{i} steps loss:{loss}&quot;)</code></pre></div>



<p>学習が終わったら、以下のようにして学習したモデルを利用してサンプリングします。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="sbm_samping" data-lang="Python"><code>samples_pred = sbm_sample(n_samples=100000, score_model=score_model, sigmas=sigmas)</code></pre></div>



<p>サンプリングされたデータの2Dのヒストグラムは以下の通りです。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="266" height="264" src="https://www.mattari-benkyo-note.com/wp-content/uploads/2023/03/predicted_sample_density.png" alt="スコアベースモデルによるサンプリングデータの可視化結果" class="wp-image-2092" srcset="https://www.mattari-benkyo-note.com/wp-content/uploads/2023/03/predicted_sample_density.png 266w, https://www.mattari-benkyo-note.com/wp-content/uploads/2023/03/predicted_sample_density-150x150.png 150w" sizes="auto, (max-width: 266px) 100vw, 266px" /><figcaption class="wp-element-caption">スコアベースモデルによるサンプリングデータの可視化結果</figcaption></figure></div>


<p>可視化結果をみると元の分布の平均の近くにデータが集中しているので、うまくいっていると考えられます。</p>



<p>ただ、やってみるとわかるのですがちゃんとした結果を得るために人手で決めないといけないハイパーパラメータの選択が難しい印象です。この結果もかなり試行錯誤してなんとかこの結果を作ることができたというイメージです。</p>



<h2 class="wp-block-heading">終わりに</h2>



<p>今回は「<a href="https://amzn.to/3SC3LMc" target="_blank" rel="noopener" title="拡散モデル　データ生成技術の数理">拡散モデル　データ生成技術の数理</a>」の2.2のスコアベースモデルの説明の部分のコードを書いたのでそのまとめの記事になります。最初、MNISTのデータでやろうとして、MNISTのデータを学習できるコードを説明するのは結構大変、ということでシンプルな混合ガウス分布にしました。ただ、それでも結構な分量になった印象です。ちなみに次のDDPMも紹介用のコードはできているので、近日中に記事を書いて公開しようと思います。</p>



<p>この記事が少しでもみなさんの理解の助けになれば幸いです。</p>



<h2 class="wp-block-heading">参考文献</h2>



<ol class="wp-block-list">
<li>Song, Y., &amp; Ermon, S. (2019). Generative Modeling by Estimating Gradients of the Data Distribution. ArXiv, abs/1907.05600.</li>



<li>Song, Y., &amp; Ermon, S. (2020). Improved Techniques for Training Score-Based Generative Models. ArXiv, abs/2006.09011.</li>



<li><a href="https://github.com/ermongroup/ncsnv2" target="_blank" rel="noopener" title="">https://github.com/ermongroup/ncsnv2</a></li>
</ol><p>The post <a href="https://www.mattari-benkyo-note.com/2023/03/08/diffusion_model_book_2_2/">[勉強ノート] 「拡散モデル　データ生成技術の数理」 2.2 スコアベースモデル</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.mattari-benkyo-note.com/2023/03/08/diffusion_model_book_2_2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1932</post-id>	</item>
		<item>
		<title>[書評] 評価指標入門〜データサイエンスとビジネスをつなぐ架け橋 ー ビジネスに機械学習を使いたいと思ったら読んでほしい1冊</title>
		<link>https://www.mattari-benkyo-note.com/2023/03/06/eval_metric_book_review/</link>
					<comments>https://www.mattari-benkyo-note.com/2023/03/06/eval_metric_book_review/#respond</comments>
		
		<dc:creator><![CDATA[Shuji Suzuki (shu)]]></dc:creator>
		<pubDate>Sun, 05 Mar 2023 22:20:49 +0000</pubDate>
				<category><![CDATA[書評]]></category>
		<category><![CDATA[ビジネス]]></category>
		<category><![CDATA[書籍]]></category>
		<category><![CDATA[機械学習]]></category>
		<guid isPermaLink="false">https://www.mattari-benkyo-note.com/?p=1915</guid>

					<description><![CDATA[<p>今回は「評価指標入門〜データサイエンスとビジネスをつなぐ架け橋」を読み終えたのでその感想の記事になります。 どんな本か？ ビジネスに機械学習のモデルを導入したり、ビジネスで利用している既存のモデルの性能は向上したのに、そ [&#8230;]</p>
<p>The post <a href="https://www.mattari-benkyo-note.com/2023/03/06/eval_metric_book_review/">[書評] 評価指標入門〜データサイエンスとビジネスをつなぐ架け橋 ー ビジネスに機械学習を使いたいと思ったら読んでほしい1冊</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>今回は「<a href="https://amzn.to/3Z31HPo" target="_blank" rel="noopener" title="評価指標入門〜データサイエンスとビジネスをつなぐ架け橋">評価指標入門〜データサイエンスとビジネスをつなぐ架け橋</a>」を読み終えたのでその感想の記事になります。</p>



<div style="text-align: center;">
<a href="https://www.amazon.co.jp/%E8%A9%95%E4%BE%A1%E6%8C%87%E6%A8%99%E5%85%A5%E9%96%80%E3%80%9C%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%E3%81%A8%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%82%92%E3%81%A4%E3%81%AA%E3%81%90%E6%9E%B6%E3%81%91%E6%A9%8B-%E9%AB%98%E6%9F%B3-%E6%85%8E%E4%B8%80/dp/4297133148?keywords=%E8%A9%95%E4%BE%A1%E6%8C%87%E6%A8%99%E5%85%A5%E9%96%80&amp;qid=1677365851&amp;sprefix=%E8%A9%95%E4%BE%A1%2Caps%2C200&amp;sr=8-1&amp;linkCode=li3&amp;tag=shu65-22&amp;linkId=e68750c7353e820d80ec390ea1a46bba&amp;language=ja_JP&amp;ref_=as_li_ss_il" target="_blank" rel="noopener"><img decoding="async" border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;ASIN=4297133148&amp;Format=_SL250_&amp;ID=AsinImage&amp;MarketPlace=JP&amp;ServiceVersion=20070822&amp;WS=1&amp;tag=shu65-22&amp;language=ja_JP"></a><img loading="lazy" decoding="async" src="https://ir-jp.amazon-adsystem.com/e/ir?t=shu65-22&amp;language=ja_JP&amp;l=li3&amp;o=9&amp;a=4297133148" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;">
</div>



<h2 class="wp-block-heading">どんな本か？</h2>



<p>ビジネスに機械学習のモデルを導入したり、ビジネスで利用している既存のモデルの性能は向上したのに、そのモデルを使おうとするとなぜかビジネスのKPIが改善しないという問題がたびたび発生します。この本ではこのようなことが起きる要因としてモデルを評価したときの評価指標が原因である場合について詳しく説明し、どう考えればこのようなことが起きないか？を解説している本になります。</p>



<p>前半ではこの問題が発生しないようにKPIを意識した評価指標の決定について詳しく書いてあります。</p>



<p>例えば、実際に使われそうなKPIを例にして、KPIをさらに細かい要素に分解し、機械学習の評価指標とKPIとの関係性をわかりやすく説明してくれています。この説明の例としては売り上げをKPIとし、「クーポンを配る相手を機械学習で決める」際、機械学習モデルの精度が変化するとどのようにKPIが変化するかなどが出てきます。</p>



<p>そして後半は機械学習で使える評価指標としてどういうものがあるかとPythonではどう計算するかを示しています。</p>



<p>1つ注意点としては後半部分は結構コードに関する説明が多い印象です。このため、この部分はプログラミングが得意ではない人にとっては難しく感じる部分かもしれません。ただ、コードで書いてある内容は日本語でもちゃんと説明されているので、プログラミングが得意ではない方は一旦コードの部分を無視するというような読み方のほうがいいかもしれません。</p>



<h2 class="wp-block-heading">どんな人におすすめか？</h2>



<p>個人的には以下のような人にはおすすめだと思います。</p>



<ol class="wp-block-list">
<li>ビジネスに機械学習を使うか検討している人</li>



<li>ビジネスとして機械学習モデルを開発している人</li>
</ol>



<p>ただし、先ほど注意点として述べたように後半はPythonのコードを使った説明が多いので、１の人でプログラミングしない人はコードの部分は無視しながら読むような感じがよいかと思います。</p>



<p>一方、２の人にとっては前半部分を参考に今のビジネスのKPIを分解し、評価指標とKPIの関係を深堀したあと、さらにもっと適切な評価指標がないか、後半を読みながら考えるというような使い方がよいかと思います。</p>



<h2 class="wp-block-heading">個人的によかった点</h2>



<p>個人的に読んで良かったと思った点としては以下の通りです。</p>



<ol class="wp-block-list">
<li>KPIと評価指標の関係性を明確に意識できるようになった</li>



<li>機械学習を使おうとしている方にこういう考え方が重要ということを伝えやすくなった</li>
</ol>



<p>1に関しては今までもKPIを意識して評価指標をこうしようということを考えていました。ただ、漠然としたイメージで止まっていたので、この本によってKPIを分解していく流れを体験できたので、今後自分でも似たような流れで考えていけそうだなという感触を得ることができました。</p>



<p>また、お客様とお話していて、機械学習を使うことを検討しているというとき、お客様のほうからKPIがどういうものか？までは伝えてくれないことが多い印象です。なので、どういうビジネスを考えていてKPIとしてどういうものを考えているかまで詳しく聞いていく必要があります。そのとき、どうしてKPIまで意識して機械学習モデルを作る必要があるのか？の一例としてこの本で示されている説明に使えそうだなと思いました。</p>



<h2 class="wp-block-heading">終わりに</h2>



<p>今回は先日読んだ「<a href="https://amzn.to/3Z31HPo" target="_blank" rel="noopener" title="評価指標入門〜データサイエンスとビジネスをつなぐ架け橋">評価指標入門〜データサイエンスとビジネスをつなぐ架け橋</a>」について紹介する記事を書きました。個人的には期待以上にビジネスで役立ちそうな印象で読んで良かったと思っています。</p>



<p>この記事がこの本を読もうか悩んでいる方の参考になれば幸いです。</p>



<p>また、今後は読んで面白かった本の紹介を毎週月曜日にしようと思いますので、今後ともよろしくお願いします。</p><p>The post <a href="https://www.mattari-benkyo-note.com/2023/03/06/eval_metric_book_review/">[書評] 評価指標入門〜データサイエンスとビジネスをつなぐ架け橋 ー ビジネスに機械学習を使いたいと思ったら読んでほしい1冊</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.mattari-benkyo-note.com/2023/03/06/eval_metric_book_review/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1915</post-id>	</item>
	</channel>
</rss>
