💾 資格バッジ図鑑
2回正解で卒業=獲得。
今日の学習スタンプ
今日、クラウドとAIとPythonの勉強をした——1問だけでもOK、続けることが合格への近道。
ルールは「知ってる」より「守れた」が偉い。30個で台紙コンプリート!
📖 まず学ぶ(講義)
前知識ゼロからでも読めるように書いています。
📚 講義の全文(38本)
クラウド・AI・Python 合格ラボ の講義38本を、そのまま読める形で置いています。アプリを起動しなくても、ここだけで内容を確かめられます。各見出しを開くと、本文・用語・図表・例題・出典が出ます。
クラウドの考え方と責任分界
クラウドとは何か、AWS認定の全体像
オンプレミスとの違い、従量課金という考え方、そして AWS 認定が4つのレベルにどう並んでいるかが分かります。
クラウドコンピューティングとは、サーバーやストレージ、データベースといったITの資源を自分で買って持つのではなく、必要なときに必要な分だけ借りて使い、使った分だけ支払う形態です。AWS はその資源を提供する事業者の一つで、利用者はマネジメントコンソールやAPI、コマンドラインから資源を要求し、不要になったら返します。要求してから使えるようになるまでの時間は分単位で、返せばその時点から料金も止まります。ここが、機器を買って自社に置く従来のやり方といちばん大きく違うところです。
従来のやり方をオンプレミスと呼びます。自社の建物や借りたデータセンターに機器を設置し、電源・空調・ネットワーク・OSの面倒まで自分で見る形です。オンプレミスでいちばん難しいのは、どれだけの性能をいつ用意するかを買う前に決めなければならない点です。多めに買えば、使われないまま減価償却していく設備を抱えることになります。少なめに買えば、繁忙期に処理が追いつかず、追加の機器が届くまで何週間も待つことになります。前者を過剰プロビジョニング、後者をキャパシティ不足といい、どちらも「将来の需要は正確には読めない」という同じ原因から生じます。クラウドは、この見積もりを事前に当てにいく作業そのものを不要にします。実際の需要に合わせて後から増やし、要らなくなったら減らせばよいからです。
料金の考え方は、AWS 公式が4つの原則として整理しています。1つ目は従量課金(Pay-as-you-go)で、長期の契約をせず、使った分だけを支払います。予測ではなく実需に合わせて増減できるので、過剰プロビジョニングのリスクが小さくなります。2つ目はコミットして節約(Save when you commit)で、Savings Plans のように1年または3年の期間で一定の使用量にコミットする代わりに、単価が割り引かれます。3つ目は使うほど安くなる(Pay less by using more)で、S3 やデータ転送のように使用量が増えるほど1GBあたりの単価が下がる段階的な料金体系が適用されます。4つ目は定額(Flat rate)で、複数のサービスをまとめて月額固定にし、超過料金が出ないようにするプランです。この4つは目的が違うので、対立するものではなく組み合わせて使います。
AWS認定は、クラウドの知識と技能を第三者に示すための資格です。レベルはFoundational、Associate、Professional、Specialtyの4つに分かれます。Foundationalはクラウド全体の概念と用語を広く浅く問う入口、Associateは実際に設計・開発・運用する立場で必要になる判断を問う中核、Professionalは複数の要件が衝突する場面での設計判断を問う上位、Specialtyはネットワークやセキュリティといった特定領域を深く問うものです。すべての認定には試験コードが付いていて、たとえば AWS Certified Cloud Practitioner なら CLF-C02、AWS Certified Solutions Architect - Associate なら SAA-C03 です。末尾の数字は改訂の世代を表すので、教材や問題集を選ぶときはこのコードが現行のものかを必ず確かめます。
認定の名称と本数は、改称・新設・終了がひんぱんに起こります。2026年8月時点で押さえておきたい変更が4つあります。第一に、SysOps Administrator - Associate は CloudOps Engineer - Associate に改称され、試験コードも SOA-C02 から SOA-C03 になりました(新コードは2025年9月30日開始)。第二に、AWS Certified Machine Learning - Specialty(MLS-C01)は2026年3月31日で受験が終了し、後継は Machine Learning Engineer - Associate です。第三に、Security - Specialty は SCS-C03 に更新され、生成AIとMLのセキュリティが加わりました。第四に、Machine Learning Engineer - Associate は MLA-C01 から MLA-C02 への切り替えが進行中です。こうした事情があるので、「Specialtyは全部で何本か」のような数を覚える勉強は割に合いません。覚えるなら試験コード付きの正式名称です。
学習計画の土台になるのが、各認定の Exam Guide に書かれた出題ドメインとその比率です。CLF-C02 は Cloud Concepts が24パーセント、Security and Compliance が30パーセント、Cloud Technology and Services が34パーセント、Billing, Pricing, and Support が12パーセントの4ドメインで構成されます。サービスの知識を問う Cloud Technology and Services がいちばん厚く、次がセキュリティです。SAA-C03 は Design Secure Architectures が30パーセント、Design Resilient Architectures が26パーセント、Design High-Performing Architectures が24パーセント、Design Cost-Optimized Architectures が20パーセントの4ドメインです。こちらもセキュアな設計がいちばん厚く、4つのドメインは名前のとおり Well-Architected の柱と対応づけて理解できます。この比率は Exam Guide に明記されている安定した事実なので、そのまま学習時間の配分に使えます。
一方で、受験料・問題数・試験時間・合格スコアは改訂のたびに動きます。2026年8月時点の参考値を挙げると、CLF-C02 は65問(うち採点対象50問)・90分・合格スコア700、SAA-C03 は65問(うち採点対象50問)・130分・合格スコア720で、スコアはどちらも100から1,000のスケールです。採点は compensatory scoring model といって、ドメインごとに合格ラインがあるわけではなく総合スコアだけで合否が決まります。未回答は不正解として扱われ、当てずっぽうで答えることへの減点はありません。本ラボでは、これらの数字は問題にしません。試験を申し込む直前に公式ページで確認するのが正しい付き合い方です。
| レベル | 正式名称 | 試験コード |
|---|---|---|
| Foundational | AWS Certified Cloud Practitioner | CLF-C02 |
| Foundational | AWS Certified AI Practitioner | AIF-C01 |
| Associate | AWS Certified Solutions Architect - Associate | SAA-C03 |
| Associate | AWS Certified Developer - Associate | DVA-C02 |
| Associate | AWS Certified CloudOps Engineer - Associate | SOA-C03 |
| Associate | AWS Certified Data Engineer - Associate | DEA-C01 |
| Associate | AWS Certified Machine Learning Engineer - Associate | MLA-C01 |
| Professional | AWS Certified Solutions Architect - Professional | SAP-C02 |
| Professional | AWS Certified DevOps Engineer - Professional | DOP-C02 |
| Professional | AWS Certified Generative AI Developer - Professional | AIP-C01 |
| Specialty | AWS Certified Advanced Networking - Specialty | ANS-C01 |
| Specialty | AWS Certified Security - Specialty | SCS-C03 |
- クラウドコンピューティング
- ITの資源を自分で保有せず、必要なときに必要な分だけ借りて使い、使った分だけ支払う利用形態。要求から利用開始までが短く、返却すれば課金も止まる。
- オンプレミス
- 自社の建物や借りたデータセンターに機器を設置し、調達から運用まで自前で行う形態。使う量を買う前に見積もる必要がある。
- 過剰プロビジョニング
- 将来の需要を多めに見積もって設備を用意しすぎ、使われない資源のコストを抱えてしまう状態。クラウドでは後から増減できるため起こりにくい。
- 従量課金(Pay-as-you-go)
- AWS の料金原則の一つ。前払いも長期のコミットメントもなく、使った分だけ支払う。実需に応じてスケールできる。
- コミットして節約(Save when you commit)
- AWS の料金原則の一つ。1年または3年の期間で一定の使用量にコミットする代わりに単価が割り引かれる。Savings Plans が代表例。
- 使うほど安くなる(Pay less by using more)
- AWS の料金原則の一つ。S3 やデータ転送などで、使用量が増えるほど単位あたりの単価が下がる段階的な料金体系が適用される。
- 定額(Flat rate)
- AWS の料金原則の一つ。複数のサービスを月額固定料金にまとめ、超過料金が発生しないようにするプラン。上位ティアへの変更ができる。
- Foundational
- AWS認定のうち、クラウドの概念と用語を広く問う入口のレベル。CLF-C02 と AIF-C01 が該当する。
- Associate
- AWS認定のうち、設計・開発・運用の実務判断を問う中核のレベル。SAA-C03、DVA-C02、SOA-C03、DEA-C01、MLA-C01 が該当する。
- Professional
- AWS認定のうち、要件が衝突する場面での上位の設計判断を問うレベル。SAP-C02、DOP-C02、AIP-C01 が該当する。
- Specialty
- AWS認定のうち、特定領域を深く問うレベル。2026年8月時点では ANS-C01 と SCS-C03 が該当するが、新設と終了が続く。
- 試験コード
- CLF-C02 や SAA-C03 のように認定ごとに付く識別子。末尾の数字が改訂の世代を表し、教材が現行版かを見分ける手がかりになる。
- Exam Guide
- AWS が認定ごとに公開する公式の試験ガイド。出題ドメインとその比率、対象範囲のサービス一覧が書かれている。
- ドメイン
- Exam Guide が定める出題分野の区分。CLF-C02 と SAA-C03 はいずれも4つのドメインで構成され、それぞれに比率が示されている。
- CloudOps Engineer - Associate
- 旧 SysOps Administrator - Associate の新名称。試験コードは SOA-C03 で、2025年9月30日に開始された。
- compensatory scoring model
- AWS認定の採点方式。ドメインごとの合格ラインはなく、総合スコアだけで合否が決まる。未回答は不正解として扱われる。
例題 季節商品を扱う通販サイトが、年に一度の繁忙期にだけ通常の10倍のアクセスを受ける。オンプレミスで運用する場合とクラウドで運用する場合とで、設備の考え方はどう変わるか。
オンプレミスでは、年に一度の10倍のピークに耐えられる台数を先に買って置いておくことになる。残りの11か月半はその設備の大半が遊んでいるが、費用は変わらず発生する。これが過剰プロビジョニングである。クラウドでは平常時の台数だけを動かしておき、繁忙期に台数を増やして、終わったら減らす。増やした期間の分だけ支払えばよいので、遊んでいる設備を抱えずに済む。ここで押さえたいのは、クラウドが安いのは単価が安いからではなく、要らない時間に払わなくてよいからだという点である。逆にいえば、24時間365日ほぼ一定の負荷しかないワークロードでは、単純な従量課金だけでは有利にならないこともある。その場合は Savings Plans のように使用量にコミットして単価を下げる原則を組み合わせる。
例題 AWS Certified Advanced Networking - Specialty の試験コードは何で、どのレベルに位置づけられるか。また、認定を「何本あるか」で覚えるのが勧められないのはなぜか。
試験コードは ANS-C01 で、レベルは Specialty である。本数で覚えるのが勧められないのは、認定の新設と終了が続いているからである。2024年4月には Data Analytics、Database、SAP on AWS の3つの Specialty が終了し、2026年3月31日には Machine Learning - Specialty(MLS-C01)も受験が終了した。一方で AI Practitioner(AIF-C01)や Generative AI Developer - Professional(AIP-C01)のように新設されたものもある。数は毎年変わるが、試験コード付きの正式名称は改訂されるまで変わらないので、こちらを手がかりに覚えるほうが長持ちする。
出典:Amazon Web Services, Inc.「AWS Certified Cloud Practitioner 試験ガイド (CLF-C02)」(2026年8月確認)/Amazon Web Services, Inc.「AWS Certified Solutions Architect - Associate 試験ガイド (SAA-C03)」(2026年8月確認)/Amazon Web Services, Inc.「AWS Certification Exam Guides」(2026年8月確認)
責任共有モデル
AWS が守る範囲と利用者が守る範囲の境目が、選んだサービスによってどう動くのかが分かります。
クラウドを使うと、機器や施設の管理は事業者に任せられます。しかし、任せられるのはそこまでで、その上に載せたデータや設定まで安全になるわけではありません。どこまでが AWS の仕事で、どこからが利用者の仕事なのかを整理したものが責任共有モデル(Shared Responsibility Model)です。AWS認定では最頻出の考え方で、CLF-C02 でも SAA-C03 でもセキュリティ関連のドメインが最も大きな比率を占めています。
AWS 公式は、境目を2つの言い方で表現します。AWS の責任は「Security of the Cloud」、つまりクラウド「の」セキュリティです。AWS はAWSクラウドで提供されるすべてのサービスを実行するインフラストラクチャの保護に責任を持ち、そこには AWSクラウドサービスを実行するハードウェア、ソフトウェア、ネットワーキング、施設が含まれます。データセンターの建物、入退室管理、電源、物理サーバー、それらをつなぐネットワーク機器、そして仮想化の基盤までが AWS 側です。利用者はこの部分を自分で監査したり触ったりはできず、AWS の第三者認証や監査報告書を通じて確認します。
利用者の責任は「Security in the Cloud」、つまりクラウド「内」のセキュリティです。ここで最も大事なのは、利用者の責任範囲が固定ではないという点です。公式は「顧客の責任は、顧客が選択するAWSクラウドサービスによって決まる」と述べています。同じ AWS でも、どのサービスを選ぶかによって、利用者がやらなければならない設定作業の量が変わります。この一文を読み飛ばすと、責任共有モデルはただの図の暗記になってしまいます。
具体的に見ます。Amazon EC2 のような仮想サーバーを選んだ場合、利用者はゲストOSの管理(更新とセキュリティパッチの適用を含む)、インスタンスに導入したアプリケーションソフトウェアやユーティリティ、そして AWS が提供するファイアウォールであるセキュリティグループの設定を担います。OSの中は利用者の領域なので、Linux に重大な脆弱性が公表されても、AWS が勝手に修正プログラムを当ててはくれません。利用者側の設定作業がいちばん多くなるのがこのタイプです。
これに対し、Amazon S3 や Amazon DynamoDB のような抽象化された、あるいはマネージドなサービスでは、AWS がインフラストラクチャ層、OS、プラットフォームまでを運用します。利用者はエンドポイントにアクセスしてデータを保存・取得するだけで、OSにログインすることもパッチを当てることもありません。そのかわり利用者は、自分のデータの管理(暗号化オプションを含む)、資産の分類、そして IAM ツールによる適切な権限の適用に責任を持ちます。つまり「OSのパッチ適用は誰の責任か」という問いには一つの答えがなく、EC2 なら利用者、S3 なら AWS が正解になります。逆に、データの分類と暗号化の選択、IAM での権限付与は、どのサービスを選んでも常に利用者の責任です。
AWS はさらに、コントロール(統制)を3つに分類しています。継承されるコントロール(Inherited Controls)は、利用者が AWS から完全に受け継ぐもので、物理的・環境的なコントロールが該当します。共有コントロール(Shared Controls)は、インフラ層と利用者層の両方に、それぞれ別々に適用されるもので、パッチ管理、構成管理、意識向上とトレーニングが挙げられています。たとえばパッチ管理は、AWS が自分のインフラにパッチを当て、利用者がゲストOSとアプリケーションにパッチを当てる、というように同じ営みが両側で並行して行われます。顧客固有のコントロール(Customer Specific Controls)は完全に利用者の責任で、サービスとゾーンのセキュリティなどが該当します。
試験でも実務でも効くのは、次の3つの判断です。物理データセンターとハードウェアのセキュリティは、どんなサービスを使っていても常に AWS。IAM での権限付与とデータの暗号化オプションの選択は、どんなサービスを使っていても常に利用者。そしてその中間にあるOSやミドルウェアの面倒を誰が見るかは、選んだサービスによって動く。この3段で覚えると、初見のサービスが出てきても「これは EC2 寄りか、S3 寄りか」と考えるだけで境目を推測できます。
| 場面 | AWS が責任を持つ範囲 | 利用者が責任を持つ範囲 |
|---|---|---|
| どのサービスでも共通 | ハードウェア、ソフトウェア、ネットワーキング、施設の保護 | データの分類、暗号化オプションの選択、IAM による権限付与 |
| Amazon EC2 を選んだ場合 | 物理基盤と仮想化レイヤーまで | ゲストOSの更新と修正プログラム、導入したアプリケーション、セキュリティグループの設定 |
| Amazon S3 や DynamoDB を選んだ場合 | インフラストラクチャ層、OS、プラットフォームの運用 | エンドポイント経由で保存するデータの管理と権限設定 |
- 責任共有モデル
- AWS と利用者のセキュリティ責任の境目を整理した公式の考え方。境目はサービスごとに動く。
- Security of the Cloud
- AWS 側の責任。AWSクラウドのすべてのサービスを実行するインフラストラクチャ、すなわちハードウェア、ソフトウェア、ネットワーキング、施設の保護を指す。
- Security in the Cloud
- 利用者側の責任。範囲は利用者が選択したAWSクラウドサービスによって決まり、選んだサービス次第で必要な設定作業の量が変わる。
- Inherited Controls
- 継承されるコントロール。利用者が AWS から完全に受け継ぐもので、物理的・環境的なコントロールが該当する。
- Shared Controls
- 共有コントロール。インフラ層と利用者層の両方にそれぞれ別々に適用されるもので、パッチ管理、構成管理、意識向上とトレーニングが該当する。
- Customer Specific Controls
- 顧客固有のコントロール。完全に利用者の責任となるもので、サービスとゾーンのセキュリティなどが該当する。
- ゲストOS
- EC2 インスタンスの中で動くOS。更新とセキュリティパッチの適用は利用者の責任範囲に含まれる。
- セキュリティグループ
- AWS が提供するファイアウォール機能。EC2 を使う場合、その設定は利用者の責任になる。
- 抽象化されたサービス
- S3 や DynamoDB のように、AWS がインフラ層・OS・プラットフォームまで運用し、利用者はエンドポイント経由でデータを扱うだけのサービス。
- 資産の分類
- 自分が扱うデータの重要度や機微さを区分する作業。抽象化されたサービスを使う場合でも利用者の責任に残る。
例題 EC2 インスタンス上で自社開発のWebアプリケーションを動かしていたところ、そのアプリの入力処理に SQL インジェクションの脆弱性があり、データを抜き取られた。AWS に責任を問えるか。
問えない。インスタンスに導入したアプリケーションソフトウェアは Security in the Cloud、すなわち利用者の責任範囲に明記されている。AWS が保証しているのは、そのインスタンスを動かしている物理サーバーやネットワーク、施設が保護されていることまでである。同じ理屈で、ゲストOSに未適用の修正プログラムが残っていて侵入された場合も、EC2 を選んでいる以上は利用者の責任になる。逆に、AWS のデータセンターに物理的に侵入されて機器が持ち出されたのであれば、それは Security of the Cloud の側の話になる。責任共有モデルは責任逃れの仕組みではなく、どちらが手を動かすべきかを事前に決めておくための地図だと考えるとよい。
例題 責任共有モデルは、利用者にとってどんな利点があるのか。
運用の負担が減ることである。物理施設の入退室管理、電源と空調の冗長化、ハードウェアの故障対応、ネットワーク機器の保守といった作業は、どんな組織でも必要だが、どこの組織がやってもだいたい同じ内容になる。これを AWS 側に寄せることで、利用者は自社にしか判断できない部分、つまりどのデータが重要で、誰にどこまでの権限を与え、どんな設定で暗号化するかに人手を集中できる。ただし、負担が減ることと責任がなくなることは別である。利用者側に残った範囲は、以前と変わらず自分で守らなければならない。
出典:Amazon Web Services, Inc.「責任共有モデル」ページ(2026年8月確認)
Well-Architected フレームワークの6本の柱
設計の良し悪しを言葉で議論するための、AWS 公式の6つの観点が分かります。
「この構成でいいのか」を議論しようとすると、話がすぐに散らかります。速さの話をしていたはずが費用の話になり、いつのまにか運用のしやすさの話になる。AWS Well-Architected フレームワークは、この議論をあらかじめ観点ごとに分けておくための枠組みです。観点は柱(Pillar)と呼ばれ、2026年8月時点では6本あります。
1本目は運用上の優秀性(Operational Excellence)です。システムの実行と監視、およびプロセスと手順の継続的な改善に焦点を当てます。デプロイを自動化する、障害のたびに振り返りを行って手順を直す、変更を小さく頻繁に行う、といった営みがここに入ります。動いているかどうかではなく、動かし続ける仕組みを良くしていくことを見る柱です。
2本目はセキュリティ(Security)です。情報とシステムの保護に焦点を当てます。データの完全性とアクセス制御が中心で、責任共有モデルで利用者側に残る範囲の大半はこの柱の関心事になります。SAA-C03 の出題ドメインでいちばん比率が大きいのが Design Secure Architectures であることからも、AWS がこの柱をどれだけ重く見ているかが分かります。
3本目は信頼性(Reliability)です。ワークロードが意図した機能を果たすこと、および障害からいかに迅速に復旧するかに焦点を当てます。複数のアベイラビリティゾーンへの分散、自動復旧、バックアップと復旧手順の検証がここに属します。「壊れないようにする」だけでなく「壊れたときに早く戻す」までを含むのが特徴です。
4本目はパフォーマンス効率(Performance Efficiency)です。ITリソースの割り当ての最適化と、ワークロードのニーズに合ったリソースタイプの選択に焦点を当てます。単に速くするのではなく、要求に見合った資源を選び、需要が変わったら選び直すという、割り当ての適切さを見る柱です。
5本目はコスト最適化(Cost Optimization)です。無駄な支出をなくし、ビジネス要件に対してリソースを適正化することに焦点を当てます。使っていない資源を止める、過大なインスタンスを適正なサイズに直す、料金モデルを使い分ける、といった判断がここに入ります。安くすること自体が目的ではなく、支払いに見合う価値が出ているかを問う柱です。
6本目は持続可能性(Sustainability)です。クラウドワークロードの実行による環境への影響を最小化することに焦点を当てます。2021年に追加された最も新しい柱で、ここが古い教材との分かれ目になります。「Well-Architected の柱は5本」と書かれた解説は、この柱が加わる前のものです。現行は6本なので、5本と覚えていたら上書きしてください。
柱どうしはしばしば衝突します。可用性を上げるために構成を二重化すれば費用は増え、費用を削れば信頼性が下がります。フレームワークが求めているのは、6つすべてを最大化することではなく、どの柱をどれだけ優先するかを意図して決め、その判断を記録しておくことです。だから設問でも「この取り組みは主にどの柱に属するか」という形で問われます。取り組みの内容そのものより、その取り組みが何を良くしようとしているのかを見るのがこつです。
| 番号 | 英語の正式名 | 日本語 | 焦点 |
|---|---|---|---|
| 1 | Operational Excellence | 運用上の優秀性 | システムの実行と監視、プロセスと手順の継続的な改善 |
| 2 | Security | セキュリティ | 情報とシステムの保護、データの完全性とアクセス制御 |
| 3 | Reliability | 信頼性 | 意図した機能を果たすこと、障害からの迅速な復旧 |
| 4 | Performance Efficiency | パフォーマンス効率 | リソース割り当ての最適化とリソースタイプの選択 |
| 5 | Cost Optimization | コスト最適化 | 無駄な支出の排除とリソースの適正化 |
| 6 | Sustainability | 持続可能性 | ワークロード実行による環境への影響の最小化 |
- AWS Well-Architected フレームワーク
- クラウド上のワークロードの設計を6つの観点から点検するための AWS 公式の枠組み。観点は柱(Pillar)と呼ばれる。
- 運用上の優秀性
- Operational Excellence。システムの実行と監視、およびプロセスと手順の継続的な改善に焦点を当てる柱。
- セキュリティ
- Security。情報とシステムの保護に焦点を当てる柱。データの完全性とアクセス制御が中心になる。
- 信頼性
- Reliability。ワークロードが意図した機能を果たすこと、および障害からいかに迅速に復旧するかに焦点を当てる柱。
- パフォーマンス効率
- Performance Efficiency。ITリソースの割り当ての最適化と、ワークロードのニーズに合ったリソースタイプの選択に焦点を当てる柱。
- コスト最適化
- Cost Optimization。無駄な支出をなくし、ビジネス要件に対してリソースを適正化することに焦点を当てる柱。
- 持続可能性
- Sustainability。クラウドワークロードの実行による環境への影響を最小化することに焦点を当てる柱。2021年に6本目として追加された。
- 柱(Pillar)
- Well-Architected フレームワークにおける設計の観点。現行は6本で、互いに衝突することがあるため優先順位を意図して決める。
例題 あるチームが、デプロイを手作業から自動化し、障害が起きるたびに振り返りの会を開いて手順書を更新する運用を始めた。この取り組みは主にどの柱に属するか。また、この取り組みが結果的に良くする別の柱はあるか。
主に属するのは運用上の優秀性である。この柱はシステムの実行と監視、およびプロセスと手順の継続的な改善に焦点を当てており、デプロイの自動化も振り返りによる手順の更新もそのまま該当する。結果的に良くなる柱としては信頼性が挙げられる。手作業のデプロイは作業ミスによる障害の原因になりやすく、それを自動化すれば障害の発生自体が減り、振り返りで復旧手順が磨かれれば復旧も早くなるからである。このように、ある取り組みが複数の柱に効くことは珍しくない。設問で問われるのは「主にどれか」なので、その取り組みが直接何を良くしようとしているのかを見る。
例題 1つの取り組みが複数の柱に同時に効くことはあるか。あるとしたら、どの柱の話として整理すればよいか。
あります。たとえば使っていないインスタンスを止める取り組みは、支出を減らすのでコスト最適化に属しますが、動いている資源が減るぶん環境への影響も小さくなるので持続可能性にも効きます。デプロイの自動化は運用上の優秀性の話ですが、手作業のミスによる障害が減るので信頼性も上がります。柱は互いに排他ではなく、同じ改善が複数にまたがるのがふつうです。整理するときは、その取り組みを始めた動機がどの柱の焦点に当たるかで主たる柱を決め、副次的に効く柱は別に書き添えます。動機で決めると、要件を満たすためにリソースの種類を選び直すのはパフォーマンス効率、払いすぎを直すために同じ作業をするのはコスト最適化、と迷わず分けられます。
出典:Amazon Web Services, Inc.「AWS Well-Architected フレームワーク」発行日 2024年11月6日(2026年8月確認)
リージョン、アベイラビリティゾーン、エッジロケーション
AWS のインフラが世界にどう配置されているかと、マルチAZという可用性設計の基本が分かります。
AWS のインフラは、大きさの違う3つの単位で語られます。リージョン、アベイラビリティゾーン、エッジロケーションです。この3つはよく並べて説明されますが、目的がまったく違います。混同したまま覚えると、可用性の設計でもコンテンツ配信の設計でも判断を誤るので、最初に切り分けておきます。
リージョン(Region)は、AWS が複数のアベイラビリティゾーンを持つ、世界の物理的な場所です。us-east-1 や ap-northeast-1 のような名前が付いています。公式の定義で押さえておきたいのは、各リージョンが「少なくとも3つの、独立して物理的に分離されたアベイラビリティゾーン」で構成されるという点です。リージョンの数そのものは増え続けていて覚える意味が薄いのですが、1リージョンが最低いくつのゾーンを持つかという構成の決まりは安定しています。リージョンを選ぶときの判断材料は、データをどの国に置くかという所在地と法規制、利用者からの距離すなわちレイテンシ、そして料金です。
アベイラビリティゾーン(Availability Zone、AZ)は、リージョンの中にある障害分離の単位です。公式の定義では、1つ以上の独立したデータセンターで構成され、それぞれが冗長化された電源、ネットワーク、接続性を備え、別々の施設に収容されているとされています。ここが肝心で、AZ は「データセンター1棟」ではなく「1つ以上のデータセンターのまとまり」であり、しかも他のAZとは別の建物に入っています。だから、ある建物が停電や火災で落ちても、同じリージョンの別のAZは動き続けます。単一のデータセンターでは実現できない水準の高可用性を、この分離によって作り出しているわけです。
この性質をそのまま設計に使うのがマルチAZ構成です。同じ役割のサーバーを2つ以上のAZに分けて置き、ロードバランサーで振り分けておけば、片方のAZがまるごと落ちても残りで処理を続けられます。データベースも、主系と待機系を別々のAZに置いて自動で切り替わるようにするのが定石です。逆にいえば、すべてを1つのAZに置いた構成は、そのAZの障害がそのままサービス全停止になります。可用性を上げたいという要件が出てきたら、まず「AZをまたいでいるか」を確認するのが出発点になります。なお、AWS のネットワークを設計するときに使うサブネットは、必ず単一のAZに属します。2つのAZにまたがる1つのサブネットは作れないので、マルチAZにしたければAZごとにサブネットを用意することになります。
エッジロケーション(Edge Location)は、まったく別の目的の単位です。Amazon CloudFront がコンテンツを配信する、世界規模のデータセンターネットワークを指します。利用者のリクエストは最も低レイテンシのエッジロケーションにルーティングされ、そこに目当てのコンテンツがキャッシュされていれば即座に配信されます。キャッシュされていなければ、オリジン(S3 バケットやHTTPサーバーなど)から取得して配信し、次回のためにキャッシュします。つまりエッジロケーションは、可用性を上げるための冗長化の単位ではなく、利用者に近いところから配りなおすためのキャッシュの拠点です。数はAZよりはるかに多く、リージョンとは独立して世界中に分散しています。Point of Presence、略してPOPとも呼ばれます。
関連する用語もいくつかあります。リージョナルエッジキャッシュ(Regional Edge Cache)は、エッジロケーションとオリジンの間に置かれるキャッシュ層で、エッジで見つからなかったときにオリジンまで取りに行く回数を減らします。Local Zones は、エンドユーザーやワークロードのより近くにあるAWSインフラでアプリケーションを実行できるようにするもので、リージョンからは離れた都市に置かれます。Wavelength Zones は、通信キャリアのネットワーク内に配置されるゾーンです。これらは「近いところで動かす」ための仕組みという点で共通しますが、Local Zones と Wavelength Zones はアプリケーションそのものを動かす場所であり、エッジロケーションはコンテンツを配るキャッシュだ、という違いがあります。
最後に数について。2026年8月時点でリージョンは39、AZは124、CloudFront のPOPは750以上、リージョナルエッジキャッシュは15、Local Zones は46、Wavelength Zones は33です。ただしこれらは毎年変わるので、本ラボでは問題にしません。覚えるべきは定義のほうです。リージョンは少なくとも3つの分離されたAZで構成される、AZは冗長化された電源とネットワークを持ち別々の施設に収容されている、エッジロケーションは最も低レイテンシの場所から配信する。この3つの文が言えれば十分です。
| 単位 | 公式の位置づけ | 主な目的 |
|---|---|---|
| リージョン | 複数のAZを持つ世界の物理的な場所。少なくとも3つの分離されたAZで構成される | データの所在地、法規制、レイテンシ、料金を見て選ぶ広い単位 |
| アベイラビリティゾーン | 1つ以上の独立したデータセンター。冗長化された電源とネットワークを備え別々の施設に収容 | リージョン内の障害分離。マルチAZ構成の土台 |
| エッジロケーション | CloudFront がコンテンツを配信する世界規模のデータセンターネットワーク | 最も低レイテンシの拠点からのキャッシュ配信 |
- リージョン
- AWS が複数のアベイラビリティゾーンを持つ、世界の物理的な場所。各リージョンは少なくとも3つの、独立して物理的に分離されたAZで構成される。
- アベイラビリティゾーン(AZ)
- 1つ以上の独立したデータセンターで構成され、冗長化された電源、ネットワーク、接続性を備え、別々の施設に収容されている、リージョン内の障害分離の単位。
- エッジロケーション
- CloudFront がコンテンツを配信する世界規模のデータセンターネットワーク。最も低レイテンシの拠点から配信し、なければオリジンから取得する。POPとも呼ばれる。
- マルチAZ
- 同じ役割のリソースを2つ以上のAZに分けて配置する可用性設計。片方のAZがまるごと停止しても処理を続けられる。
- サブネット
- VPC 内のIPアドレス範囲。必ず単一のAZに属するため、マルチAZ構成にするにはAZごとにサブネットを用意する。
- オリジン
- CloudFront がキャッシュを持っていないときにコンテンツを取りに行く元の場所。S3 バケットやHTTPサーバーなどが該当する。
- リージョナルエッジキャッシュ
- エッジロケーションとオリジンの間に置かれるキャッシュ層。オリジンまで取りに行く回数を減らす。
- Local Zones
- エンドユーザーやワークロードのより近くのAWSインフラでアプリケーションを実行できるようにする仕組み。リージョンから離れた都市に置かれる。
- Wavelength Zones
- 通信キャリアのネットワーク内に配置されるゾーン。
例題 東京リージョンで動かしているWebサイトについて、南米からのアクセスだけ画像の表示が遅いという苦情が来た。まず検討すべき手はどれか。リージョンを南米にも増やす案とどう違うか。
まず検討すべきは CloudFront を前に置き、エッジロケーションから配信させることである。エッジロケーションは世界中に分散していて、リクエストは最も低レイテンシの拠点にルーティングされる。画像のような静的コンテンツは一度キャッシュされれば、以降は南米の拠点から直接返るので、東京まで取りに行く往復がなくなる。リージョンを増やす案との違いは規模である。リージョンを増やすとは、アプリケーションもデータベースも別の場所に構築し、データの同期と整合性まで面倒を見るということで、費用も運用の手間も桁が違う。配信の遅さがコンテンツの距離に由来するなら、キャッシュの拠点を増やすほうが先に効く。
例題 新しいシステムをどのリージョンに置くかを決めることになった。何を材料に判断するか。
3つある。第一にデータの所在地と法規制である。扱うデータをどの国に置いてよいのかが決まっている場合、そこが最優先の制約になる。第二にレイテンシで、主な利用者がいる場所に近いリージョンほど応答が速くなる。第三に料金で、同じサービスでもリージョンによって単価が異なる。この3つが衝突するときは、法規制が動かせない制約なので最初に置き、残りの2つで比べることになる。なお、どのリージョンを選んでも「少なくとも3つの分離されたAZで構成される」という前提は変わらないので、AZの数で選ぶ必要はない。
出典:Amazon Web Services, Inc.「AWS Global Infrastructure」(2026年8月確認)/Amazon Web Services, Inc.「Amazon CloudFront デベロッパーガイド」(2026年8月確認)
AWSの主要サービス
コンピューティング EC2とLambdaとコンテナ
仮想サーバーのEC2、コードだけを預けるLambda、コンテナを束ねるECSとEKS、そして基盤の管理を手放すFargate。どれに何をやらせるのかが分かります。
AWSでいうコンピューティングとは、要するに「計算をする場所を借りる」ことです。ただし借り方が一通りではありません。サーバーを1台まるごと借りて中身を全部自分で決めるやり方、コードだけを預けて動かしてもらうやり方、コンテナの集まりを預けて配置と台数だけ面倒を見てもらうやり方。この3つの借り方の違いが、そのままEC2・Lambda・コンテナサービスの違いになっています。
Amazon EC2(Amazon Elastic Compute Cloud)は、クラウド上で安全かつサイズ変更可能なコンピューティング能力を提供するWebサービスです。公式の説明で大事なのは2点で、使った分だけ支払うことと、コンピューティングリソースを完全に制御できることです。完全に制御できるということは、裏返せばOSの面倒も自分で見るということでもあります。台数も止め時も自分で決めるので、動かしている間はずっと費用が発生します。
AWS Lambdaは、サーバーのプロビジョニングや管理をせずにコードを実行できるサービスです。課金は消費したコンピューティング時間に対してだけで、コードが実行されていない間は料金が発生しません。ここがEC2との決定的な差です。1日に数回しか呼ばれない処理をEC2で待ち受けると、待っている大半の時間にも費用がかかりますが、Lambdaなら呼ばれた分しかかかりません。逆に、四六時中フルに動き続ける処理なら、この特徴は効きません。
コンテナは、アプリケーションと必要なライブラリをひとまとめにして、どこでも同じように動かせる形にしたものです。数が増えるとどのサーバーにどれを何個置くかという管理が要り、それを引き受けるのがオーケストレーションです。Amazon ECS(Amazon Elastic Container Service)はAWSのフルマネージドなコンテナオーケストレーションサービスで、コンテナ化したアプリケーションのデプロイ・管理・スケールを容易にします。Amazon EKS(Amazon Elastic Kubernetes Service)は、自前でKubernetesクラスターをインストール・運用することなくAWS上でKubernetesを実行できるマネージドサービスで、Kubernetes準拠の認定を受けています。すでにKubernetesの資産があるならEKS、AWSの流儀でまとめたいならECS、という分かれ方になります。
AWS Fargateは、コンテナ向けのサーバーレスな従量課金コンピューティングエンジンです。サーバーやクラスターのプロビジョニング・設定・スケールが不要で、ECSやEKSの起動タイプとして使います。ここを取り違えないでください。Fargateは「コンテナをどこで走らせるか」の答えであって、「コンテナをどう配置し管理するか」の答えではありません。後者はECSやEKSの仕事なので、Fargateを使ってもECSやEKSが不要になるわけではありません。
ECSでタスクを動かす基盤、つまりキャパシティの選択肢は、基本が2つです。Fargateを選べばAWSが基盤を管理し、利用者はインスタンスの存在を意識しません。EC2を選べばインスタンスタイプと台数を利用者が選び、自分で管理します。ほかにECS Managed Instances、オンプレミス向けのECS Anywhereもあります。どちらを選んでもコンテナの配置とスケールはECSが行い、変わるのは基盤の面倒を誰が見るかです。
つまずきどころは「サーバーレス」という言葉です。これは物理サーバーが存在しないという意味ではありません。サーバーはAWS側にあり、利用者がその調達・設定・スケールをしなくてよい、という意味です。Lambdaが「サーバーのプロビジョニングや管理なしに」と説明され、Fargateが「サーバーやクラスターのプロビジョニング・設定・スケールが不要」と説明されるのは、どちらもこの意味においてです。
ECS でキャパシティを決めるときの順番 1. インスタンスに固有の設定を入れる必要があるか -> あるなら EC2 起動タイプ(自分で管理する) -> ないなら 2 へ 2. インスタンスの運用を引き受ける担当がいるか -> いないなら Fargate(AWS が基盤を管理) どちらを選んでも、コンテナの配置とスケールは ECS が行う
| サービス | 預けるもの | 利用者に残る仕事 | 向く場面 |
|---|---|---|---|
| EC2 | ハードウェアと仮想化 | OSの管理、台数と稼働時間の判断 | 常時動かす、環境を細かく決めたい |
| Lambda | サーバーの一切 | コードとイベントの設計 | 呼び出しがまばら、待ち時間に払いたくない |
| ECS | コンテナの配置とスケール | コンテナの中身と基盤の選択 | AWSの流儀でコンテナを束ねたい |
| EKS | Kubernetesの運用 | Kubernetesの設定とコンテナの中身 | Kubernetesの資産をそのまま活かしたい |
| Fargate | 基盤のサーバーとクラスター | コンテナに与える資源の指定 | インスタンスを一切持ちたくない |
- Amazon EC2
- Amazon Elastic Compute Cloud。サイズ変更可能なコンピューティング能力(仮想サーバー)を提供する。使った分だけ支払い、コンピューティングリソースを完全に制御できる。
- AWS Lambda
- サーバーのプロビジョニングや管理なしにコードを実行できるサービス。消費したコンピューティング時間にのみ課金され、実行されていない間は料金が発生しない。
- Amazon ECS
- Amazon Elastic Container Service。フルマネージドのコンテナオーケストレーションサービスで、コンテナ化アプリケーションのデプロイ・管理・スケールを容易にする。
- Amazon EKS
- Amazon Elastic Kubernetes Service。自前でKubernetesクラスターをインストール・運用することなくAWS上でKubernetesを実行できる。Kubernetes準拠認定済み。
- AWS Fargate
- コンテナ向けのサーバーレス従量課金コンピューティングエンジン。サーバーやクラスターのプロビジョニング・設定・スケールが不要で、ECSやEKSの起動タイプとして使う。
- サーバーレス
- 物理サーバーが無いという意味ではなく、サーバーの調達・設定・スケールを利用者が行わなくてよいという意味。LambdaやFargateの説明に使われる。
- オーケストレーション
- 多数のコンテナを、どのサーバーにいくつ置き、落ちたらどう入れ替えるかまで含めて自動で束ねること。ECSやEKSが担う役割。
- キャパシティの選択肢
- ECSでタスクを動かす基盤の選び方。基本はFargate(AWSが管理)とEC2(利用者がインスタンスタイプと台数を選び管理)の2つ。ほかにECS Managed InstancesとECS Anywhereがある。
- 起動タイプ
- コンテナを実際に走らせる基盤の種類。FargateとEC2があり、配置と管理を行うECSやEKSとは役割が別。
- イベント駆動
- 何かが起きたときにだけ処理を動かす作り。Lambdaはこの形に向き、待っている時間に費用がかからない。
例題 例題:社内で常に一定の負荷がかかり続けるアプリケーションサーバーと、月末に一度だけ動く集計処理がある。それぞれどのコンピューティングが向くか。
常時動かすものはEC2が向きます。使った分だけ支払う形ですが、そもそも止める時間がないので、環境を完全に制御できる利点のほうが効きます。月末に一度だけの集計はLambdaが向きます。消費したコンピューティング時間にのみ課金され、動いていない残りの日には料金が発生しないからです。同じ「計算する場所」でも、動いていない時間が長いほどLambda側の利点が大きくなります。
例題 例題:「Fargateを使えばECSもEKSも要らない」という説明は正しいか。
正しくありません。Fargateはコンテナ向けのサーバーレス従量課金コンピューティングエンジンで、ECSやEKSの起動タイプとして使うものです。つまり「どこで走らせるか」を引き受ける役で、「どのコンテナを何個どこに置き、どう入れ替えるか」というオーケストレーションはECSやEKSの仕事のまま残ります。両者は置き換えではなく組み合わせです。
出典:Amazon Web Services, Inc. AWS ホワイトペーパー「Amazon Web Services の概要」コンピューティング(2026年8月確認)
ストレージ S3とEBSとEFSの使い分け
オブジェクト・ブロック・ファイルという3つのデータの持ち方の違いと、アーカイブ向けのS3 Glacierの選び方が分かります。
AWSのストレージは「容量がいくら」ではなく「データをどういう単位で持つか」で分かれます。ここを押さえないと、S3・EBS・EFSがどれも同じ入れ物に見えてしまいます。オブジェクト・ブロック・ファイルという3つの持ち方があり、それぞれS3・EBS・EFSが対応します。試験でも実務でも、まずこの対応を体に入れるところから始まります。
Amazon S3(Amazon Simple Storage Service)はオブジェクトストレージです。任意の量のデータを保存・保護でき、スケーラビリティ・可用性・セキュリティ・パフォーマンスに優れると公式に説明されています。データはHTTPのAPIエンドポイント経由で丸ごと出し入れするもので、OSからディスクとして見えるわけではありません。用途としてはWeb、モバイル、バックアップ、アーカイブ、IoT、ビッグデータ分析が挙げられています。
Amazon EBS(Amazon Elastic Block Store)はブロックストレージです。EC2インスタンスで使う永続的なボリュームで、OSからはディスクとして見えます。アベイラビリティゾーン内で自動的にレプリケートされ、一貫した低レイテンシ性能を提供します。ここで効いてくるのが単一AZという性質と、原則として1つのインスタンスにアタッチして使うという性質です。OSの起動ディスクやデータベースのデータ領域には向きますが、多数のサーバーで同じ場所を共有する用途には向きません。
Amazon EFS(Amazon Elastic File System)はファイルストレージです。Linuxワークロード向けのシンプルでスケーラブル、エラスティックなファイルシステムで、ファイルの増減に応じて容量が自動で伸縮します。そして数千台のEC2インスタンスからの並列共有アクセスに対応します。「複数のサーバーが同じディレクトリを同時に読み書きしたい」という要件が出たら、EFSを思い出す場面です。容量を先に決めなくてよいのも、ブロックストレージとの分かりやすい違いです。
3つの使い分けは、要件の言い回しから逆算できます。「複数のEC2から同時にマウントして共有したい」ならEFS。「1台のEC2のOSやデータベースのディスクが要る」ならEBS。「静的コンテンツやバックアップをオブジェクトとして置きたい」ならS3。実際のシステムでは3つを同時に使うのが普通で、どれか1つを選ぶ問題ではなく、役割ごとに割り振る問題だと考えてください。
長期保管にはS3 Glacierというアーカイブ用のストレージクラス群があります。即時の取り出しが必要なデータ向けのS3 Glacier Instant Retrieval、めったにアクセスしない長期データ向けのS3 Glacier Flexible Retrieval、最低コストで数時間かけて取り出すS3 Glacier Deep Archiveの3つです。選ぶときにまず決めるのは容量でも料金でもなく、取り出しにどれだけ待てるかです。待てないなら費用は上がり、数時間待てるなら最も安く保管できる、という交換になっています。
つまずきどころは、EBSとEFSの取り違えです。名前がどちらもElastic ... Storeで似ていますが、EBSのBはBlock、EFSのFはFileです。ブロックは1台に接続してディスクとして使うもの、ファイルは多数のホストからマウントして共有できるもの、と覚えると迷いません。
| サービス | データの単位 | 同時に使える範囲 | 典型的な置き物 |
|---|---|---|---|
| S3 | オブジェクト | APIから誰でも(権限次第) | 静的コンテンツ、バックアップ、分析用データ |
| EBS | ブロック | 原則1つのEC2インスタンス | OSの起動ディスク、データベースのデータ領域 |
| EFS | ファイル | 多数のEC2から並列に共有 | 複数サーバーで共有する作業領域や配信素材 |
| S3 Glacier | オブジェクト(アーカイブ) | 取り出してから利用 | 監査ログ、法定保存の記録、古い成果物 |
- Amazon S3
- Amazon Simple Storage Service。任意の量のデータを保存・保護できるオブジェクトストレージ。Web、モバイル、バックアップ、アーカイブ、IoT、ビッグデータ分析などに使う。
- Amazon EBS
- Amazon Elastic Block Store。EC2インスタンスで使う永続的なブロックストレージボリューム。AZ内で自動的にレプリケートされ、一貫した低レイテンシ性能を提供する。
- Amazon EFS
- Amazon Elastic File System。Linuxワークロード向けのファイルシステム。容量が自動で伸縮し、数千台のEC2インスタンスからの並列共有アクセスに対応する。
- オブジェクトストレージ
- データを丸ごと1つの塊として保存し、APIで出し入れする方式。OSからディスクとしては見えない。S3がこれにあたる。
- ブロックストレージ
- OSからディスクとして見える方式。ファイルシステムを載せて使う。EBSがこれにあたり、原則1つのインスタンスにアタッチする。
- ファイルストレージ
- ディレクトリとファイルの形で、複数のホストからマウントして共有できる方式。EFSがこれにあたる。
- S3 Glacier
- アーカイブ用のストレージクラス群。取り出しの速さと費用の兼ね合いでInstant Retrieval、Flexible Retrieval、Deep Archiveから選ぶ。
- S3 Glacier Deep Archive
- 最低コストで保管し、取り出しに数時間かける長期保管向けのクラス。めったに読まない記録の置き場に向く。
- エラスティック
- 使う量に応じて自動で伸び縮みする性質。EFSはファイルの増減に応じて容量が自動で伸縮するため、事前の容量設計が要らない。
- 単一AZ
- EBSのボリュームが1つのアベイラビリティゾーン内で自動レプリケートされる性質。AZをまたぐ可用性は別の仕組みで確保する。
例題 例題:Webサーバーを3台に増やしたところ、利用者がアップロードした画像が、アップロードを受けた1台にしか無いという不具合が出た。どこに置けばよいか。
各サーバーのEBSに置いたままだと、EBSは原則1つのインスタンスにアタッチするブロックストレージなので、ほかの2台からは見えません。3台が同じディレクトリを見る必要があるならEFSを共有のファイルシステムとしてマウントします。画像を配信するだけならS3にオブジェクトとして置き、アプリケーションはURLで参照する形も定番です。どちらも「1台に閉じない置き場に移す」という点は同じです。
例題 例題:S3 Glacierのどのクラスにするかを決めるとき、最初に確かめるべきことは何か。
取り出しにどれだけ待てるかです。すぐ読み出す必要があるならS3 Glacier Instant Retrieval、めったにアクセスしない長期データならS3 Glacier Flexible Retrieval、数時間待てるなら最低コストのS3 Glacier Deep Archiveになります。容量から考えると迷いますが、取り出しの速さから考えると一本道です。
出典:Amazon Web Services, Inc. AWS ホワイトペーパー「Amazon Web Services の概要」ストレージ(2026年8月確認)
データベース RDSとAuroraとDynamoDB
リレーショナルのRDSとAurora、NoSQLのDynamoDB、インメモリのElastiCache、データウェアハウスのRedshift。5つの役割の違いが分かります。
データベースも、ストレージと同じで「どれが優れているか」ではなく「何をさせたいか」で選びます。表と行の形で厳密に扱いたいのか、キーを指定して1件ずつ高速に出し入れしたいのか、大量のデータをまとめて集計したいのか、それとも同じ問合せを何度も繰り返すので手前で受け止めたいのか。この問いに対する答えが、それぞれRDS、DynamoDB、Redshift、ElastiCacheです。
Amazon RDS(Amazon Relational Database Service)は、クラウドでのリレーショナルデータベースのセットアップ・運用・スケールを容易にするマネージドサービスです。ハードウェアのプロビジョニング、データベースのセットアップ、パッチ適用、バックアップといった管理作業を自動化します。裏返すと、自動化されるのは運用の手間であって、表と列の設計や索引をどこに張るかといった設計の判断は利用者に残ります。ここを混同すると「マネージドなら何もしなくてよい」という誤解になります。
Amazon Auroraは、MySQL・PostgreSQL互換のフルマネージドなリレーショナルデータベースエンジンです。重要なのは、AuroraがRDSの一部だということです。別サービスではなく、同じマネジメントコンソール、CLI、API操作でプロビジョニング、パッチ適用、バックアップ、復旧、障害検知を行います。違いは管理の単位で、標準のRDSが個々のDBインスタンスを管理するのに対し、Auroraはレプリケーションで同期されたDBサーバーのクラスター全体を管理します。Aurora固有の性質としては、高性能な分散共有ストレージサブシステムを持ち、ストレージが必要に応じて自動で拡張されること、同等ハードウェア上の標準のMySQLやPostgreSQLに比べて高いスループットを狙う設計であることが挙げられます。
Amazon DynamoDBは、キーバリュー型/ドキュメント型のNoSQLデータベースです。あらゆる規模で1桁ミリ秒のパフォーマンスを提供する、フルマネージドかつマルチリージョン対応のデータベースと説明されています。キーを指定して1件ずつ読み書きする用途、たとえばセッション情報や利用者ごとの設定、大量の端末からの書き込みなどに向きます。表を結合して複雑な条件で絞り込むような使い方は、リレーショナル側の得意分野です。
Amazon ElastiCacheは、クラウドでインメモリキャッシュを簡単にデプロイ・運用・スケールできるサービスです。ディスクベースのデータベースに依存せず、高速なインメモリキャッシュから情報を取得することでWebアプリケーションの性能を改善します。データベースの置き換えではなく、その手前に置いて同じ読み出しを受け止める役です。何度も同じ結果を返している問合せがあるなら、そこがElastiCacheの出番になります。
Amazon Redshiftは、クラウド上のフルマネージド・ペタバイト規模のデータウェアハウスサービスです。データセットの大小によらず、既存のSQLベースのツールやBIアプリケーションから高速なクエリ性能を提供します。RDSとの違いは目的で、RDSが日々の取引を1件ずつ読み書きする業務システムを支えるのに対し、Redshiftは大量に貯まった実績データをまとめて集計し分析するためのものです。どちらもSQLで問い合わせるので、名前だけ見ると似て見えるのが厄介なところです。
つまずきどころは2つです。1つはAuroraをRDSと無関係の別物だと思ってしまうこと。もう1つは、RedshiftをRDSの上位版だと思ってしまうことです。前者は「RDSの一部で、管理の単位がクラスター」、後者は「同じSQLでも分析用と取引用で別物」と押さえてください。
| サービス | 種別 | 得意なこと | 選ぶ合図になる要件 |
|---|---|---|---|
| RDS | リレーショナル | 日々の取引を関係モデルで読み書きする | 既存の業務システムをそのまま移したい |
| Aurora | リレーショナル(RDSの一部) | クラスター全体を管理し高い性能を出す | MySQLやPostgreSQL互換のまま強くしたい |
| DynamoDB | NoSQL | キーを指定した1件ずつの高速な読み書き | 規模が読めず、応答を短く保ちたい |
| ElastiCache | インメモリ | 同じ読み出しをメモリで受け止める | 同一の問合せが繰り返され応答が遅い |
| Redshift | データウェアハウス | 大量の実績データをまとめて集計する | BIツールから分析したい |
- Amazon RDS
- Amazon Relational Database Service。リレーショナルDBのセットアップ・運用・スケールを容易にし、ハードウェアの用意、パッチ適用、バックアップなどを自動化する。
- Amazon Aurora
- MySQL・PostgreSQL互換のフルマネージドなリレーショナルDBエンジン。RDSの一部で、個々のインスタンスではなくクラスター全体を管理の単位とする。
- 分散共有ストレージ
- Auroraが持つ高性能なストレージのしくみ。DBサーバー群で共有され、必要に応じて容量が自動で拡張される。
- Amazon DynamoDB
- キーバリュー型/ドキュメント型のNoSQLデータベース。あらゆる規模で1桁ミリ秒のパフォーマンスを提供し、マルチリージョンに対応する。
- Amazon ElastiCache
- インメモリキャッシュをデプロイ・運用・スケールするサービス。ディスクベースDBに依存せず、メモリから情報を取得して応答を速くする。
- Amazon Redshift
- フルマネージド・ペタバイト規模のデータウェアハウスサービス。既存のSQLベースのツールやBIアプリから高速なクエリ性能を得られる。
- データウェアハウス
- 分析のために大量のデータを集めて置いておく基盤。1件ずつの取引を捌く業務データベースとは目的が違う。
- NoSQL
- 表と行の関係モデルによらないデータベースの総称。DynamoDBはキーバリュー型とドキュメント型に対応する。
- マネージドサービス
- 運用作業をAWSが引き受ける形のサービス。RDSではハードウェアの用意、セットアップ、パッチ適用、バックアップが自動化されるが、設計の判断は利用者に残る。
- クラスター
- レプリケーションで同期された複数のDBサーバーのまとまり。Auroraはこの単位で管理する。
例題 例題:利用者のプロフィール画面を開くたびに同じ問合せがRDSへ飛び、負荷が上がっている。作り変えずに応答を速くする手はあるか。
ElastiCacheを手前に置く手があります。ElastiCacheはディスクベースのデータベースに依存せず、高速なインメモリキャッシュから情報を取得することでWebアプリケーションの性能を改善するサービスです。何度も同じ結果を返している読み出しであれば、2回目以降をメモリから返せるので、RDS側の負荷も同時に下がります。データベースそのものを置き換える話ではない点が要点です。
例題 例題:オンプレミスのMySQLで動く業務システムをAWSへ移す。互換性は保ちたいが、複数台構成をまとめて面倒を見てほしい。何を選ぶか。
Auroraが候補になります。AuroraはMySQL・PostgreSQL互換のフルマネージドなリレーショナルDBエンジンで、RDSの一部として同じコンソールやAPIから運用できます。標準のRDSが個々のDBインスタンスを管理するのに対し、Auroraはレプリケーションで同期されたDBサーバーのクラスター全体を管理するので、「まとめて面倒を見てほしい」という要件に噛み合います。
出典:Amazon Web Services, Inc. AWS ホワイトペーパー「Amazon Web Services の概要」データベース(2026年8月確認)
アプリケーション統合とファンアウト
SQSのキューとSNSのトピック、EventBridge、Step Functions、API Gateway。部品どうしをどうつなぐと壊れにくいのかが分かります。
システムが大きくなると、部品どうしを直接呼び合わせる作りが重荷になります。呼ばれた側が遅ければ呼んだ側も止まり、呼ばれた側が落ちれば要求は消え、宛先が増えるたびに呼ぶ側を直すことになるからです。この重荷を減らすために、間にメッセージの仕組みを挟むのがアプリケーション統合です。要点は、直接つながずに「置き場」や「配り役」を挟むことにあります。
Amazon SQS(Amazon Simple Queue Service)は、分散したソフトウェアシステムやコンポーネントを統合して疎結合化する、セキュアで耐久性と可用性に優れたホスト型のキューサービスです。送り手はメッセージをキューに入れた時点で自分の仕事を終え、受け手は自分の速度でポーリングして取り出します。通常は1つのコンシューマが取り出すポイントツーポイントの形です。キューには標準キューとFIFOキューがあり、標準キューはat-least-once配信、FIFOキューはexactly-once処理と順序保証を備えます。
Amazon SNS(Amazon Simple Notification Service)は、パブリッシャーからサブスクライバーへメッセージを配信するフルマネージドのパブ/サブサービスです。パブリッシャーはトピック、すなわち論理的なアクセスポイントかつ通信チャネルへ非同期にメッセージを送り、そのトピックを購読している宛先へ同時にプッシュ配信されます。サブスクライバーの種別は、SQS・Lambda・HTTP(S)・Data Firehoseなどのアプリ間を指すA2Aと、Eメール・モバイルプッシュ・SMSなどの対人を指すA2Pに整理されます。
SQSとSNSは対で覚えます。SQSはキューで、メッセージを保持し、通常1つの受け手が取り出す1対1の形。SNSはトピックで、1つのメッセージを複数の購読者へ同時に押し出す1対多の形です。そして両者を組み合わせたのがファンアウトパターンで、SNSトピックの購読者として複数のSQSキューを並べる構成です。公式に定番として示されている形で、1件の出来事を集計用・通知用・監査用といった複数の処理へ配りつつ、それぞれの受け手はキューのおかげで自分の速度で処理できます。
Amazon EventBridgeは、イベントを使ってアプリケーションのコンポーネント同士を接続するサーバーレスサービスで、イベントの取り込み・フィルタリング・変換・配信を行います。中心にあるイベントバスは、多数のソースから多数のターゲットへイベントをルーティングするルーターです。またEventBridge Schedulerは、cron式やrate式による定期実行や単発実行を管理します。決まった時刻に何かを起動したい、という要件はここで扱います。
AWS Step Functionsは、ワークフローすなわちステートマシンを作成するサービスです。分散アプリケーションの構築、プロセスの自動化、マイクロサービスのオーケストレーション、データや機械学習のパイプライン作成に使い、各ステップをstate、実行中のインスタンスをexecutionと呼びます。「AのあとにBを実行し、失敗したらCへ」という手順そのものを外に出して図として持てるのが利点です。起動役のEventBridgeと、手順を進める役のStep Functionsは、組み合わせて使う関係にあります。
Amazon API Gatewayは、REST・HTTP・WebSocketのAPIをあらゆる規模で作成・公開・維持・監視・保護するサービスです。EC2上のワークロード、Lambda、任意のWebアプリケーションといったバックエンドへのアクセスのフロントドアとして機能します。外から来る要求の入口がAPI Gateway、内側で部品どうしをつなぐのがSQSやSNSやEventBridge、と場所で整理すると混ざりません。
つまずきどころは、SQSとSNSの向きの取り違えです。キューは受け側が取りに行く置き場、トピックは送り側が押し出す配り役、と方向で覚えてください。この向きが分かっていれば、ファンアウトが「トピックからキューへ」であって逆ではないことも自然に出てきます。
ファンアウトパターンの形
在庫更新イベント
|
SNS トピック
/ | \
SQS SQS SQS <- 購読者として3本のキューを並べる
| | |
集計用 通知用 監査用 <- それぞれ自分の速度で取り出す
宛先を増やすときは購読を1つ足すだけで、送る側は直さない
| サービス | つなぎ方 | 宛先の数 | 選ぶ合図になる要件 |
|---|---|---|---|
| SQS | キューに置き、受け手が取りに来る | 通常は1つ | 受け手を待たせたくない、取りこぼしたくない |
| SNS | トピックへ送り、購読者へ押し出す | 複数 | 1件の出来事を同時に多数へ知らせたい |
| EventBridge | イベントバスが送り先へ振り分ける | 複数 | 多数の発生元と送り先を規則で結びたい |
| Step Functions | 手順を状態として並べて進める | 手順の数だけ | 順序や失敗時の分岐を外に出して管理したい |
| API Gateway | 外からの要求をバックエンドへ中継 | 設定した経路 | APIとして外部へ公開し保護したい |
- Amazon SQS
- Amazon Simple Queue Service。コンポーネントを疎結合化するホスト型のキューサービス。メッセージを保持し、通常1つのコンシューマがポーリングして取り出す。
- 標準キューとFIFOキュー
- SQSのキューの種類。標準キューはat-least-once配信で重複がありうる。FIFOキューはexactly-once処理と順序保証を備える。
- Amazon SNS
- Amazon Simple Notification Service。パブリッシャーからサブスクライバーへ配信するフルマネージドのパブ/サブサービス。トピックへ非同期に送る。
- トピック
- SNSでメッセージを受け取る論理的なアクセスポイントかつ通信チャネル。購読している宛先へ同時にプッシュ配信される。
- A2AとA2P
- SNSのサブスクライバー種別。A2Aはアプリ間(SQS、Lambda、HTTP(S)、Data Firehoseなど)、A2Pは対人(Eメール、モバイルプッシュ、SMS)。
- ファンアウトパターン
- 1つのSNSトピックから複数のSQSキューへ同時に配信する定番構成。1件の出来事を複数の処理へ配りつつ、受け手ごとに自分の速度で処理できる。
- Amazon EventBridge
- イベントでコンポーネント同士を接続するサーバーレスサービス。イベントの取り込み・フィルタリング・変換・配信を行う。
- イベントバス
- 多数のソースから多数のターゲットへイベントをルーティングするルーター。EventBridgeの中心となる仕組み。
- EventBridge Scheduler
- cron式やrate式による定期実行と単発実行を管理する仕組み。決まった時刻の起動はここで扱う。
- AWS Step Functions
- ワークフロー(ステートマシン)を作成するサービス。各ステップをstate、実行中のインスタンスをexecutionと呼ぶ。
- Amazon API Gateway
- REST・HTTP・WebSocketのAPIを作成・公開・維持・監視・保護するサービス。バックエンドへのアクセスのフロントドアとして機能する。
- 疎結合
- 部品どうしが互いの都合に引きずられない状態。間にキューを挟むと、片方の遅れや停止がもう片方を止めにくくなる。
例題 例題:SNSトピックにLambdaを直接購読させる構成と、SNSトピックからSQSキューを挟んでLambdaへ渡す構成では、何が変わるか。
キューを挟むとメッセージがいったん保持され、受け手が自分の速度で取り出せるようになります。SQSは疎結合化のためのキューサービスで、送り手はキューに入れた時点で仕事を終えられます。したがって受け手側が一時的に遅れても、送り手や配り役はその影響を受けにくくなります。直接購読は経路が短くて済む代わりに、受け手側の都合がそのまま出やすい形です。
例題 例題:毎朝決まった時刻に、3段階の集計処理を順番に流したい。起動と進行はそれぞれどのサービスが担うか。
起動はEventBridge Schedulerです。cron式やrate式による定期実行や単発実行を管理する仕組みなので、時刻による起動はここで扱います。3段階の順序と失敗時の分岐を持つのはStep Functionsで、ワークフローすなわちステートマシンとして各ステップをstateで並べます。「いつ始めるか」と「どういう順で進めるか」を別のサービスに持たせるのが、この2つの組み合わせ方です。
出典:Amazon Web Services, Inc.「Amazon Simple Queue Service デベロッパーガイド」(2026年8月確認)
ネットワーク・運用・料金
VPCとRoute 53とCloudFront
自分専用の仮想ネットワークを引き、名前で引けるようにし、世界中へ速く配る。AWSのネットワークの土台を4つのサービスで押さえます。
Amazon VPC(Virtual Private Cloud)は、論理的に分離された、自分で定義した仮想ネットワークの中にAWSリソースを起動できるサービスです。自社データセンターの従来型ネットワークによく似た構成を、AWSのスケーラブルなインフラの上に作れる、というのが公式の言い方です。ここを取り違えると後がすべてずれるので、まず「VPCは自分のネットワークの箱である」と押さえてください。コンテンツを速く配るCDNでも、名前を引くDNSでもありません。
VPCの中身は4つの部品でだいたい説明できます。サブネットはVPC内のIPアドレスの範囲で、必ず単一のアベイラビリティゾーンに属します。したがってサブネットはAZをまたげず、複数のAZに分散させたければAZごとにサブネットを作ります。ルートテーブルは、サブネットやゲートウェイからのトラフィックの向き先を決める表です。インターネットゲートウェイはVPCをインターネットに接続する出入口、NATゲートウェイはプライベートIPアドレスを持つリソースが、プライベートのままインターネットへアクセスできるようにする仕組みです。
よく使われる「パブリックサブネット」「プライベートサブネット」という言い方は、サブネットそのものに種類があるという意味ではありません。ルートテーブルがインターネットゲートウェイに向いているかどうかで、そう呼び分けているだけです。外から入られたくないが、中から更新を取りには行きたい。この要求に応えるのがNATゲートウェイで、内から外への通信を代理するだけなので、外からの接続は成立しません。ここが、インターネットゲートウェイとの一番大きな違いです。
Amazon Route 53 は、可用性とスケーラビリティに優れたDNSウェブサービスです。持っている機能はドメイン登録、DNSルーティング、ヘルスチェックの3つで、これらを任意に組み合わせて使えます。3つがそろっていないと動かない、という関係ではありません。ドメインは別の登録事業者で取得したまま、DNSルーティングとヘルスチェックだけを Route 53 に任せる、という使い方ができます。名前の由来にもなっているとおり、中心にあるのはDNSの役割です。
Amazon CloudFront は、静的および動的なWebコンテンツの配信を高速化するCDNです。エッジロケーションと呼ばれる世界規模のデータセンターネットワークを持ち、利用者のリクエストは最も低レイテンシのエッジロケーションへルーティングされます。そこにコンテンツがあれば即座に配信し、無ければオリジン(S3バケットやHTTPサーバーなど)から取得します。エッジロケーションとオリジンの間にはリージョナルエッジキャッシュという層もあります。エッジロケーションはリージョンとは独立して世界中に分散していて、AZよりはるかに数が多いのが特徴です。
AWS Direct Connect は、社内ネットワークと Direct Connect ロケーションを、標準的なイーサネット光ファイバーケーブルで接続するサービスです。公式の説明で効くのは「ネットワーク経路上のISPをバイパスする」という一句で、インターネットを通らずにAWSサービスへの仮想インターフェイスを直接作成できます。インターネットの上に暗号化トンネルを張る方式とは、ここが根本的に違います。専用の物理的な接続を引く、という理解でよいでしょう。
4つを並べると役割の重なりがありません。VPCが自分のネットワークを定義し、Route 53 が名前を引き当て、CloudFront が中身を速く配り、Direct Connect が社内との専用の道をつなぎます。試験でも実務でも、まず「これはどの層の話か」を見分けるところから始まります。設問に出てくる動詞を見て、区切る・引く・配る・つなぐ、のどれかに当てはめてみてください。
| 部品 | 役割 | つまずきどころ |
|---|---|---|
| サブネット | VPC内のIPアドレスの範囲を切り出す | 必ず単一のAZに属し、AZをまたげない |
| ルートテーブル | トラフィックの向き先を決める | パブリックかプライベートかはここで決まる |
| インターネットゲートウェイ | VPCをインターネットに接続する | 外からの接続も通る出入口である |
| NATゲートウェイ | 内側のリソースの外向き通信を代理する | 外から入ってくる接続は成立しない |
- Amazon VPC
- 論理的に分離された、自分で定義した仮想ネットワーク内にAWSリソースを起動できるサービス。自社データセンターの従来型ネットワークに似た構成をAWS上で実現する。
- サブネット
- VPC内のIPアドレスの範囲。必ず単一のアベイラビリティゾーンに属するので、AZをまたぐことはできない。複数AZに分けたければAZごとに作る。
- ルートテーブル
- サブネットやゲートウェイからのトラフィックの向き先を決める表。どのゲートウェイへ経路を向けているかが、サブネットの性格を決める。
- インターネットゲートウェイ
- VPCをインターネットに接続するための出入口。ここへの経路を持つサブネットが、慣用的にパブリックサブネットと呼ばれる。
- NATゲートウェイ
- プライベートIPアドレスを持つリソースが、プライベートのままインターネットへアクセスできるようにする仕組み。内から外への通信を代理する。
- Amazon Route 53
- 可用性とスケーラビリティに優れたDNSウェブサービス。ドメイン登録、DNSルーティング、ヘルスチェックの3つの機能を任意に組み合わせて使える。
- ドメイン登録
- Route 53 の機能の1つ。ドメイン名そのものを取得・管理する。他社で取得したドメインのまま、残りの機能だけを使うこともできる。
- ヘルスチェック
- Route 53 の機能の1つ。対象が正常に応答しているかを確認する。DNSルーティングやドメイン登録とは独立して利用できる。
- Amazon CloudFront
- 静的・動的Webコンテンツの配信を高速化するCDN。世界規模のエッジロケーションから、最も低レイテンシの場所を選んで配信する。
- エッジロケーション
- CloudFront がコンテンツを配信する世界規模のデータセンターの網。リージョンとは独立して分散し、AZよりはるかに数が多い。
- オリジン
- CloudFront が配信するコンテンツの元となる場所。S3バケットやHTTPサーバーなど。キャッシュに無いときはここへ取りに行く。
- リージョナルエッジキャッシュ
- エッジロケーションとオリジンの間に位置するキャッシュ層。エッジで外れたリクエストを、オリジンへ行く前に受け止める。
- AWS Direct Connect
- 社内ネットワークと Direct Connect ロケーションを光ファイバーで接続するサービス。経路上のISPをバイパスして直接つなぐ。
- Local Zones
- エンドユーザーやワークロードのより近くのAWSインフラでアプリケーションを実行するための拠点。通信キャリア網内に置くものは Wavelength Zones という。
例題 例題:東京リージョンで、2つのアベイラビリティゾーンにまたがる冗長構成を作りたい。VPCとサブネットは、それぞれいくつ必要か。
VPCはリージョン単位の仮想ネットワークなので1つで足ります。一方サブネットは必ず単一のAZに属するため、1つのサブネットで2つのAZをまとめることはできません。したがってAZごとに1つずつ、最低2つのサブネットを作り、同じ役割のリソースを分けて配置します。ルートテーブルは複数のサブネットに関連づけられるので、性格が同じサブネットどうしなら共通のものを使えます。
例題 例題:静的なWebサイトを世界に公開する。Route 53 と CloudFront は、どう役割を分けるか。
利用者はまずドメイン名を引きます。ここを担うのが Route 53 のDNSルーティングで、名前から配信先へ導きます。実際の中身を返すのが CloudFront で、最も低レイテンシのエッジロケーションから配信し、キャッシュに無ければオリジンのS3バケットなどへ取りに行きます。名前を引くのが Route 53、中身を配るのが CloudFront、という分担です。どちらもVPCの中に置くものではない点にも注意してください。
出典:Amazon Web Services, Inc.「Amazon Virtual Private Cloud ユーザーガイド」(2026年8月確認)
ELBの3種類を選び分ける
ALB・NLB・GWLB。見ている層と扱えるプロトコルが違うだけで、選ぶ理由ははっきり決まります。
Elastic Load Balancing(ELB)は、1つ以上のアベイラビリティゾーンにある複数のターゲットへ、受信するアプリケーショントラフィックを自動的に分散するサービスです。単一のAZに閉じるものではありません。複数のAZに分けて置いたターゲットへ振り分けられることが、可用性を設計するうえでの土台になります。現行のELBには Application Load Balancer、Network Load Balancer、Gateway Load Balancer の3種類があり、加えて古い世代の Classic Load Balancer があります。
Application Load Balancer(ALB)はレイヤー7、つまりアプリケーション層で動作します。扱えるプロトコルはHTTP、HTTPS、gRPCです。レイヤー7まで見るということは、HTTPの中身、たとえばURLのパスやホスト名を判断材料にできるということで、これをコンテンツベースルーティングと呼びます。用途を一言でいえば、柔軟なアプリケーション管理です。パスごとに別のサーバー群へ送りたい、といった要求はALBの領分になります。
Network Load Balancer(NLB)はレイヤー4、トランスポート層で動作します。扱えるプロトコルはTCP、UDP、TLSです。HTTPの中身は見ませんが、そのぶん極めて高いパフォーマンスが出せます。もう1つの大きな持ち味が静的IPアドレスで、取引先のファイアウォールに送信元や宛先のIPを登録してもらう必要がある、といった場面ではNLBを選びます。UDPを使う通信を分散したい場合も、3種類のうちNLBだけが対応します。
Gateway Load Balancer(GWLB)はレイヤー3と4で動作し、扱うのはIPです。目的が他の2つと違っていて、アプライアンス型のセキュリティ機能やネットワーク機能を経路上に置くために使います。特徴的なのは、フローを終端せずに透過的に通すという点です。ALBやNLBは自分がいったん通信を受けて分散しますが、GWLBは検査装置へ通信を素通しさせる役目を負います。サードパーティ製のファイアウォールや侵入検知の機器を挟みたい、という要求が出たらGWLBを思い出してください。
選び分けは、次の順に自問すると迷いません。まず、何を見て振り分けたいか。URLのパスやホスト名ならALBです。次に、扱うプロトコルは何か。UDPを通したいならNLBしかありません。次に、相手に伝える固定のIPアドレスが要るか。要るならNLBです。最後に、通信の途中にアプライアンスを挟みたいか。挟みたいならGWLBです。番号でいえば、ALBが7、NLBが4、GWLBが3と4。数字が大きいほど上位の情報まで見て判断できる、と考えると並びが頭に残ります。
参考として、Classic Load Balancer が対応するのはTCP、SSL/TLS、HTTP、HTTPSです。レイヤー4とレイヤー7の両方にまたがる古い世代の作りで、現在は用途に応じて3種類のどれかを選ぶのが基本です。なお、どのELBを選んでも「1つ以上のAZにある複数のターゲットへ分散する」という基本の役割は変わりません。違うのは、何を見て、どのプロトコルで、どう通すかだけです。
| 観点 | ALB | NLB | GWLB |
|---|---|---|---|
| OSIレイヤー | レイヤー7 | レイヤー4 | レイヤー3と4 |
| 扱うプロトコル | HTTP、HTTPS、gRPC | TCP、UDP、TLS | IP |
| 主な用途 | 内容による柔軟な振り分け | 高い性能と静的IP | アプライアンスを透過 |
| フローの終端 | 自分が受けて分散する | 自分が受けて分散する | 終端せず透過的に通す |
- Elastic Load Balancing
- 1つ以上のアベイラビリティゾーンにある複数のターゲットへ、受信するアプリケーショントラフィックを自動的に分散するサービス。ELBと略す。
- Application Load Balancer
- レイヤー7で動作するロードバランサ。HTTP、HTTPS、gRPCを扱い、内容に基づく柔軟な振り分けができる。ALBと略す。
- Network Load Balancer
- レイヤー4で動作するロードバランサ。TCP、UDP、TLSを扱う。極めて高いパフォーマンスと静的IPが必要な場合に選ぶ。NLBと略す。
- Gateway Load Balancer
- レイヤー3と4で動作しIPを扱うロードバランサ。アプライアンス型のセキュリティ機能やネットワーク機能を、フローを終端せず透過的に通す。
- コンテンツベースルーティング
- URLのパスやホスト名といったHTTPの中身を判断材料にして、リクエストの送り先を変える振り分け方。レイヤー7で動くALBの持ち味。
- 静的IPアドレス
- 変わらないIPアドレス。相手側のファイアウォールに登録してもらう必要があるときに要る。3種類のうちNLBの持ち味として挙げられる。
- gRPC
- ALBが扱えるプロトコルの1つ。HTTP、HTTPSと並んでALBの対応表に載っており、NLBやGWLBでは扱わない。
- ターゲット
- ロードバランサが振り分ける先のリソース。1つ以上のアベイラビリティゾーンにまたがって配置でき、そこがELBの可用性設計の要になる。
- アプライアンス透過
- GWLBの性質。通信のフローを終端せず、検査装置などへそのまま通す。ALBやNLBのように自分が通信を受けて分散するのとは考え方が違う。
- Classic Load Balancer
- 古い世代のロードバランサ。TCP、SSL/TLS、HTTP、HTTPSに対応する。現在は用途に応じてALB・NLB・GWLBから選ぶのが基本。
- レイヤー7
- OSI参照モデルのアプリケーション層。ここまで見ると、HTTPのパスやホスト名といった中身を判断材料にできる。ALBが動作する層。
- レイヤー4
- OSI参照モデルのトランスポート層。TCPやUDPのポート番号までを見る。NLBが動作する層で、HTTPの中身までは見ない。
例題 例題:3種類のロードバランサのうちどれを選ぶか迷ったとき、最初に何を確かめると早く決まるか。
扱うプロトコルです。ALBはHTTP、HTTPS、gRPCを扱うレイヤー7、NLBはTCP、UDP、TLSを扱うレイヤー4、GWLBはIPを扱うレイヤー3と4です。通すものがHTTPならALB、UDPのような下位のプロトコルならNLB、IPパケットをそのままアプライアンスへ通したいならGWLB、というふうに、プロトコルだけでほとんど絞れます。絞りきれないときは2つ目の軸として、静的IPアドレスが要るか、フローを終端してよいかを見ます。静的IPが要るならNLB、終端せず素通しさせたいならGWLBです。「どの層まで中身を見たいか」を先に言葉にしておくと、選択肢の消し込みが速くなります。
例題 例題:金融機関との専用の接続で、相手にこちら側のIPアドレスを事前に登録してもらう必要がある。加えて独自のUDPプロトコルも通したい。どうするか。
どちらの条件もNLBが満たします。NLBはレイヤー4で動作し、TCP、UDP、TLSを扱えるうえ、静的IPアドレスを持たせられます。ALBはHTTP、HTTPS、gRPCしか扱わないのでUDPが通りません。条件が2つ以上あるときは、プロトコルとIPの2軸で先に絞ると早く決まります。
出典:Amazon Web Services, Inc.「Elastic Load Balancing ユーザーガイド」(2026年8月確認)
IAMとセキュリティのサービス
誰が入れて何ができるかを決めるIAMを軸に、鍵・防御・秘密・アプリ利用者のIDまでを一列に並べます。
AWS Identity and Access Management(IAM)は、AWSリソースへのアクセスを安全に制御するサービスです。公式の説明では「誰が認証(サインイン)され、誰が認可(権限を持つ)されるかを管理する」とされています。認証と認可は別の段階です。認証は本人であることを確かめること、認可はそのうえで何をしてよいかを決めること。サインインできたのに操作ができない、という状況は障害ではなく、認可がまだ与えられていないだけ、ということがよくあります。
IAMで扱う主な部品は、ユーザー・グループ・ロール・ポリシーです。ユーザーは個々の主体、グループはユーザーをまとめたもの、ロールは一時的に引き受けて使う権限のまとまり、ポリシーは何を許可し何を拒否するかを書いた文書です。認可はポリシーによって表現され、それをユーザー・グループ・ロールのどれに結び付けるかで適用範囲が決まります。まずポリシーに書いてあることがすべて、と考えると整理しやすくなります。
AWS Key Management Service(KMS)は、データの暗号化や署名に使うキーの作成と制御を容易にするマネージドサービスです。KMSキーは FIPS 140-3 セキュリティレベル3 の認証を受けたHSMで保護され、暗号化されない状態でKMSの外に出ることはありません。ここが要点で、鍵そのものをファイルに書き出して配る、という使い方は成立しません。鍵を渡すのではなく、暗号化や復号の操作をKMSに依頼できるよう、相手にIAMで権限を与えるのが筋です。
AWS WAF は、保護対象のWebアプリケーションリソースへ転送されるHTTPおよびHTTPSリクエストを監視し、コンテンツへのアクセスを制御するWebアプリケーションファイアウォールです。リクエストに対して取れる動作は、許可、ブロック、カウント、そしてCAPTCHAやチャレンジです。カウントという選択肢があるのが実務では効きます。いきなりブロックせず、まず数えて影響を見てから本番のルールにする、という進め方ができるからです。
AWS Shield はDDoS攻撃からの保護を担います。Standard は AWS WAF などに追加費用なしで自動的に含まれる基本保護です。Advanced は追加料金の拡張保護で、レイヤー7のDDoSの自動緩和、詳細な可視化、そして Shield Response Team(SRT)による専任のサポートが受けられます。まず Standard が働いている前提で考え、それ以上が要るときに Advanced を検討する、という順序になります。
AWS Secrets Manager は、データベース認証情報、アプリケーション認証情報、OAuthトークン、APIキーといったシークレットを、ライフサイクル全体にわたって管理・取得・ローテーションするサービスです。値そのものを安全に持ち回りたいときの置き場所、と考えてください。鍵そのものを扱うKMSとは役割が隣り合っていますが、KMSが暗号化の道具を管理するのに対し、Secrets Manager は秘密の値を管理します。
Amazon Cognito は、Webアプリやモバイルアプリ向けのIDプラットフォームです。混同しやすいのが2つのプールです。ユーザープールは、アプリやAPIに対してユーザーを認証・認可するユーザーディレクトリで、独立したOIDCのIdPとして機能し、OAuth 2.0のトークンやJWTを発行します。IDプールは、認証済みまたは未認証のユーザーにAWSリソースへのアクセス権を与えるもので、AWS STS 経由で一時的なAWS認証情報を発行します。そして両者の統合は互いに必須ではありません。片方だけでも使えます。
最後に AWS Firewall Manager です。これは個々の防御を行うサービスではなく、AWS WAF、Shield Advanced、VPCのセキュリティグループとネットワークACL、Network Firewall、Route 53 Resolver DNS Firewall といった保護を、複数アカウント・複数リソースにまたがって一元管理するためのものです。アカウントが増えてきて、同じ保護をどこにも漏れなく効かせたい、という段階で出てきます。
| サービス | 担うこと |
|---|---|
| IAM | 誰が認証され、誰が認可されるかを管理する |
| KMS | 暗号化や署名のキーを作成し、HSMの中で保護する |
| WAF | HTTPとHTTPSのリクエストを監視し、許可・ブロック・カウント・CAPTCHAで制御する |
| Shield | DDoS攻撃から守る。Standard は追加費用なし、Advanced は追加料金 |
| Secrets Manager | 認証情報やAPIキーを管理・取得・ローテーションする |
| Cognito | アプリ利用者のIDを扱う。ユーザープールとIDプールの2つがある |
| Firewall Manager | 複数アカウント・複数リソースの保護を一元管理する |
- AWS IAM
- AWSリソースへのアクセスを安全に制御するサービス。誰が認証(サインイン)され、誰が認可(権限を持つ)されるかを管理する。
- 認証
- 本人であることを確かめる段階。サインインできるかどうかの話であり、何をしてよいかまでは決めない。
- 認可
- 認証を済ませた主体が、何をしてよいかを決める段階。ポリシーで表現され、ユーザー・グループ・ロールに結び付けて適用する。
- IAMロール
- 一時的に引き受けて使う権限のまとまり。特定の人に固定するのではなく、必要なときに引き受ける形で権限を渡せる。
- IAMポリシー
- 何を許可し何を拒否するかを書いた文書。認可の実体はここにあり、ユーザー・グループ・ロールのどれに結び付けるかで適用範囲が決まる。
- AWS KMS
- 暗号化や署名に使うキーの作成と制御を容易にするマネージドサービス。KMSキーは認証を受けたHSMで保護される。
- HSM
- 鍵を保護する専用のハードウェア。KMSキーは FIPS 140-3 セキュリティレベル3 の認証を受けたHSMで守られ、平文のまま外に出ない。
- AWS WAF
- 保護対象へ転送されるHTTPおよびHTTPSリクエストを監視し、アクセスを制御するWebアプリケーションファイアウォール。
- Shield Standard
- AWS Shield の基本保護。AWS WAF などに追加費用なしで自動的に含まれる。DDoS攻撃に対する土台となる防御。
- Shield Advanced
- 追加料金の拡張保護。レイヤー7のDDoSの自動緩和、詳細な可視化、Shield Response Team による専任サポートを提供する。
- Shield Response Team
- SRT。Shield Advanced で受けられる専任のサポート体制。攻撃を受けている最中の対応を支援する。
- AWS Secrets Manager
- データベース認証情報、アプリケーション認証情報、OAuthトークン、APIキーなどを、ライフサイクル全体にわたって管理・取得・ローテーションするサービス。
- ローテーション
- シークレットの値を定期的に入れ替えること。Secrets Manager が管理する対象のライフサイクルに含まれる操作の1つ。
- ユーザープール
- Cognito の機能。アプリやAPIに対してユーザーを認証・認可するユーザーディレクトリで、OIDCのIdPとしてトークンやJWTを発行する。
- IDプール
- Cognito の機能。認証済みまたは未認証のユーザーにAWSリソースへのアクセス権を与え、AWS STS 経由で一時的なAWS認証情報を発行する。
- AWS STS
- 一時的な認証情報を発行する仕組み。Cognito のIDプールは、これを経由してAWSリソースへアクセスするための認証情報を渡す。
- AWS Firewall Manager
- WAF、Shield Advanced、セキュリティグループとネットワークACL、Network Firewall、Route 53 Resolver DNS Firewall の保護を、複数アカウントにまたがって一元管理する。
例題 例題:新しく入った運用担当者がAWSにサインインできるようになった。ところがS3バケットの一覧が表示されない。どこを疑うか。
サインインできている以上、認証は通っています。足りていないのは認可のほうです。IAMは認証と認可の両方を扱いますが、この2つは別の段階で、サインインできることと操作が許されることは一致しません。必要な操作を許可するポリシーが、そのユーザーか、所属するグループか、引き受けるロールに結び付いているかを確認します。障害を疑う前に、まずポリシーを読むのが近道です。
例題 例題:KMS で作った鍵を、社内の別システムでも使いたいのでファイルに書き出して渡してほしい、と頼まれた。どう答えるか。
できません、と答えます。KMSキーは FIPS 140-3 セキュリティレベル3 の認証を受けたHSMで保護され、暗号化されない状態でKMSの外に出ることはないためです。代わりに、暗号化や復号の操作をKMSに依頼できるよう、相手にIAMで権限を与えます。なお、データベースのパスワードのように値そのものを持ち回る必要があるものは、Secrets Manager の管轄になります。鍵と秘密の値は、置き場所が違うと覚えてください。
出典:Amazon Web Services, Inc.「AWS Identity and Access Management ユーザーガイド」(2026年8月確認)
監視と記録とIaCと料金
CloudWatch・CloudTrail・Config の3つを混ぜないこと。そのうえで、コミットの仕方で料金がどう変わるかを整理します。
Amazon CloudWatch は、AWSリソースとその上で動くアプリケーションをリアルタイムで監視するサービスです。メトリクス、ログ、アラーム、ダッシュボードによって、アプリケーションのパフォーマンス、運用状態、リソース使用率をシステム全体にわたって見えるようにします。答えられる問いは「今、何がどれだけ動いているか」です。CPUが上がった、エラーが増えた、といった性能と状態の話は、まずここを見ます。
AWS CloudTrail は、AWSアカウントの運用・リスク監査、ガバナンス、コンプライアンスのためのサービスで、ユーザー・ロール・AWSサービスが取ったアクションをイベントとして記録します。対象はマネジメントコンソール、CLI、SDKやAPI経由の操作です。答えられる問いは「誰が、いつ、どのAPI操作をしたか」です。設定を変えたのは誰か、という問いに答えられるのはこのサービスだけです。
AWS Config は、AWSリソースの構成の詳細なビューを提供します。リソース同士の関係、および過去にどう構成されていたかを記録し、構成と関係が時間とともにどう変化したかを追跡できます。さらに Config ルールで構成を評価し、違反しているリソースを非準拠としてフラグします。答えられる問いは「今どう構成されていて、いつどう変わったか」です。3つを一列に並べると、CloudWatch が性能と状態、CloudTrail が操作の記録、Config が構成の記録と準拠性評価、となります。
3つは競合するサービスではありません。CloudTrail のトレイルは S3 バケットに保存され、オプションで CloudWatch Logs にも配信できます。つまり CloudTrail が送る側、CloudWatch Logs が受け先という関係も成り立ちます。試験では「誰が」なら CloudTrail、「どう構成されているか」なら Config、「どれだけ動いているか」なら CloudWatch、と機械的に振り分けて構いません。
AWS CloudFormation は、AWSリソースをモデル化してセットアップするサービスです。必要なリソースを記述したテキストファイルであるテンプレートを作成すると、CloudFormation がそのとおりにリソースをプロビジョニングし設定します。作成されたリソース群はスタックという1つの単位で管理でき、まとめて削除もできます。これがインフラをコードとして扱う、いわゆるIaCの形です。テンプレートが設計図、スタックが出来上がったものの一まとまり、という対応で覚えてください。
AWS Systems Manager は、AWS・オンプレミス・マルチクラウドの各環境にあるノードを、大規模に一元的に表示・管理・運用するための統合インターフェイスです。Run Command、Session Manager、Automation、Parameter Store、Patch Manager、Fleet Manager といった機能を含みます。台数が増えたときに、1台ずつ入って作業するのをやめるための道具、と考えるとよいでしょう。
料金の考え方は4つの原則で整理されています。従量課金は使った分だけ支払うこと。コミットして節約は、Savings Plans により1年または3年の期間で特定の使用量にコミットする代わりに割引を受けること。使うほど安くなるは、S3やデータ転送などで段階的な料金体系が適用され、使用量が増えるほど単価が下がること。定額は、複数のサービスを月額固定料金にまとめること。まずこの4つを頭に置きます。
EC2の購入オプションは、性質の違いで覚えます。オンデマンドは前払いも長期のコミットもなく、時間単位または秒単位の従量課金です。Savings Plans は使用量へのコミット。リザーブドインスタンスはインスタンスタイプ・プラットフォーム・テナンシーといった属性へのコミット。スポットインスタンスは、AWSクラウドの未使用のEC2キャパシティを使うもので、大幅な割引がある代わりに中断されることがあります。期間はいずれも1年または3年、支払いは全額前払い・一部前払い・前払いなしから選びます。割引率の数字は変わるので、覚えるのは性質のほうです。
Savings Plans の中では、Compute Savings Plans と EC2 Instance Savings Plans の違いが問われます。Compute は最も柔軟で、インスタンスファミリーの変更、リージョンの変更、EC2 と Fargate と Lambda の間の移行、OSの変更に対応します。EC2 Instance は特定リージョンの特定インスタンスファミリーにコミットするため、ファミリー内のサイズ変更やOSの変更はできても、ファミリーとリージョンの変更はできません。リザーブドインスタンスにも Standard と Convertible があり、Convertible は同等以上の価値の別のものと交換できます。
| サービス | 記録・監視するもの | 答えられる問い |
|---|---|---|
| CloudWatch | メトリクス、ログ、アラーム | 今、何がどれだけ動いているか |
| CloudTrail | ユーザーやサービスのAPI操作 | 誰が、いつ、何をしたか |
| AWS Config | リソースの構成と関係の履歴 | どう構成され、いつ変わったか |
- Amazon CloudWatch
- AWSリソースとアプリケーションをリアルタイムで監視するサービス。メトリクス、ログ、アラーム、ダッシュボードで性能と状態を見える化する。
- AWS CloudTrail
- ユーザー・ロール・AWSサービスが取ったアクションをイベントとして記録するサービス。誰がどのAPI操作をしたかを後から追える。
- AWS Config
- AWSリソースの構成と関係、およびその変化を記録するサービス。Config ルールで評価し、違反リソースを非準拠としてフラグする。
- Config ルール
- AWS Config が構成を評価するための決まりごと。評価に通らないリソースを非準拠として示し、準拠性の管理に使う。
- AWS CloudFormation
- テンプレートに書いたとおりにAWSリソースをプロビジョニング・設定するサービス。インフラをコードとして扱うIaCの代表。
- テンプレート
- CloudFormation で、必要なリソースを記述したテキストファイル。これを読み込ませると、記述どおりのリソースが作られる。
- スタック
- CloudFormation が作成したリソース群を、1つの単位としてまとめたもの。まとめて管理でき、まとめて削除もできる。
- AWS Systems Manager
- AWS・オンプレミス・マルチクラウドのノードを大規模に一元管理する統合インターフェイス。Run Command や Session Manager などを含む。
- オンデマンド
- EC2の購入オプション。前払いも長期のコミットもなく、時間単位または秒単位で従量課金される。使用量が読めないときに向く。
- Savings Plans
- 一定の使用量へのコミットと引き換えに割引を受ける料金モデル。期間は1年または3年、支払いは全額前払い・一部前払い・前払いなしから選ぶ。
- Compute Savings Plans
- 最も柔軟な Savings Plans。インスタンスファミリーの変更、リージョンの変更、EC2 と Fargate と Lambda の間の移行、OSの変更に対応する。
- EC2 Instance Savings Plans
- 特定リージョンの特定インスタンスファミリーにコミットする Savings Plans。ファミリーとリージョンの変更はできない。
- リザーブドインスタンス
- インスタンスタイプ・プラットフォーム・テナンシーといった属性にコミットして割引を受ける料金モデル。Standard と Convertible がある。
- Convertible RI
- 同等以上の価値の別のものと交換でき、インスタンスファミリー、OS、テナンシー、支払いオプションを変更できるリザーブドインスタンス。
- スポットインスタンス
- AWSクラウドの未使用のEC2キャパシティを使う購入オプション。大幅な割引がある代わりに中断されることがある。
- 従量課金
- 使った分だけ支払うというAWSの料金の原則。長期のコミットメントなしに、予測ではなく実需に応じてスケールできる。
例題 例題:ある日を境に月額のコストが急に増えた。CloudWatch・CloudTrail・AWS Config を、どういう順で使って原因をたどるか。
まず CloudWatch で、いつから何のメトリクスが伸びたのかを見て、性能と状態の面から当たりを付けます。次に AWS Config で、その前後にリソースの構成がどう変わったかを確認します。最後に CloudTrail で、その構成変更につながるAPI操作を誰がいつ行ったのかをたどります。性能、構成、操作という3つの視点を順に重ねるのが定石です。1つのサービスで全部を見ようとすると行き詰まります。
例題 例題:平日の日中に必ず動かす基幹の処理と、夜間にまとめて回すバッチがある。EC2の購入オプションをどう組み合わせるか。
基幹の処理は止められないので、使用量が読めるなら Savings Plans で使用量にコミットします。インスタンスの属性まで固定できるならリザーブドインスタンスも候補です。夜間のバッチは中断されても再実行できるので、未使用のEC2キャパシティを使うスポットインスタンスが向きます。読み切れない分はオンデマンドで受ければ十分です。期間は1年か3年、支払いは全額前払い・一部前払い・前払いなしから選びます。
出典:Amazon Web Services, Inc.「Amazon CloudWatch ユーザーガイド」(2026年8月確認)
AIの歴史と基本問題
人工知能とは何か、そしてディープラーニングまで
人工知能・機械学習・ディープラーニングの入れ子の関係、人工知能のレベルの4分類、そしてディープラーニングがどう伸びてきたかが分かります。
G検定の出題範囲は「G検定 試験出題範囲(シラバス2024)第1.4版」で、この版は2026年5月11日に出されたものです。範囲の最初に置かれているのが「人工知能とは」という大項目で、その1つ目の中項目が「1. 人工知能の定義」です。ここで求められているのは、シラバスの目標欄によれば「人工知能とは何か、具体例を用いて説明できる」「人工知能のレベルを『単純な制御プログラム』『古典的な人工知能』『機械学習』『深層学習』の4つに分類し、それぞれがどのようなものか説明することができる」「AI効果を説明できる」「人工知能とロボットの違いを説明できる」の4つです。つまり定義の一文を丸暗記する試験ではなく、具体例で説明できるか、似たものと区別できるかを見る試験だ、と読み取れます。
まず押さえるのが3つの語の入れ子の関係です。いちばん広い枠が人工知能で、その中の一つのやり方が機械学習、さらにその中で層を深く重ねたニューラルネットワークを使うものがディープラーニングです。シラバスの「1. 人工知能の定義」には、この3語が AI効果・エージェント と並んでキーワードとして置かれています。機械学習を最も広い枠にしたり、ディープラーニングと機械学習を並列に置いたりする説明は、この包含の向きを取り違えたものです。ディープラーニングは機械学習の外にある別の何かではなく、機械学習の中の一つのやり方だ、と繰り返し確認してください。
次が人工知能のレベルの4分類です。シラバスの目標欄に書かれているとおり、「単純な制御プログラム」「古典的な人工知能」「機械学習」「深層学習」の4つです。単純な制御プログラムは、どういう条件のときにどう動くかという対応を、人がすべて書き切ってしまうものです。設定温度で入切する温度調節のような仕組みが当てはまります。古典的な人工知能は、場合分けの数が多く、探索したり蓄えておいた知識を引いたりして対応を選ぶものです。機械学習は、対応を人が書き切るのをやめて、データから規則性を見つけさせるものです。深層学習はそのうち、層を深く重ねたネットワークを使って、より抽象的な表現を段階的に取り出していくものです。この4つは上に行くほど、人が書き下す部分が減り、データに任せる部分が増えていきます。同じ用途の製品でも世代によってどのレベルにあたるかが変わるので、製品の名前ではなく中の決まり方で見分けます。
AI効果は、シラバスが「説明できる」ことを名指しで求めている数少ない語です。人工知能の成果とされたものでも、仕組みが解明されて中身が分かってしまうと「これは単なる自動処理であって知能ではない」と受け取られ、評価が下がっていく現象を指します。かつては知的な成果と言われた処理が、普及すると当たり前の技術として扱われ、人工知能とは呼ばれなくなっていく、という形で現れます。よく取り違えられるのがシンギュラリティで、こちらは人工知能が人間の知能を超えてその先が見通せなくなる転換点をめぐる議論であり、「2. 人工知能分野で議論される問題」のキーワードです。AI効果は評価の下がり方の話、シンギュラリティは将来の転換点の話で、置かれている中項目からして別物です。
エージェントも「1. 人工知能の定義」のキーワードです。環境を観測し、目標に向けて自分で次の行動を選ぶ主体を指す見方で、人工知能を「どういう仕組みで作られているか」ではなく「どう振る舞うか」から捉えるための語です。この見方をとると、中身が探索であっても学習であっても、環境を見て行動を選んでいるならエージェントとして同じ枠で語れます。画面上の操作の入口や、データを整える担当者のことではありません。
「人工知能とロボットの違いを説明できる」という目標も、シラバスに直接書かれています。ロボットは体を持つ機械そのものを指し、人工知能はその中で判断を担う部分にあたります。この2つは重なることはあっても同じものではありません。体を持たずソフトウェアだけで動く人工知能はいくらでもありますし、逆に、決められた動きを繰り返すだけで人工知能を含まないロボットもあります。判断する側と体にあたる側を入れ替えないように気をつけてください。
大項目「人工知能をめぐる動向」の最後にあたる「6. ディープラーニング」には、ImageNet・ILSVRC・LeNet・アルファ碁(AlphaGo)・人間の神経回路・ネオコグニトロン・生成AI が並んでいます。ImageNet は大量の画像に分類のラベルを付けた大規模なデータセット、ILSVRC はそれを使って画像認識の精度を競った競技会です。データセットと競技会という関係なので、対にして覚えます。LeNet は手書きの数字を認識するために作られた、畳み込みを用いたニューラルネットワークです。ネオコグニトロンは、人間の神経回路のはたらきに着想を得て、層を重ねて視覚の情報を段階的に扱おうとしたモデルで、シラバスが「人間の神経回路」という語をすぐ隣に置いているのは、層を重ねるという発想がどこから来たのかを押さえさせるためだと読めます。アルファ碁(AlphaGo)は囲碁の対局で人間のトップ棋士に勝ったプログラム、生成AI は文章や画像などを新しく作り出すものの総称です。生成AI は第1.3版でこの位置に入った語で、それ以前は同じ枠に「LLM(大規模言語モデル)」が置かれていました。
この中項目の目標は「ディープラーニングがどのように発展してきたのか、その歴史を説明できる」ことです。歴史をたどるときは、大項目「人工知能をめぐる動向」の中項目が「3. 探索・推論」「4. 知識表現とエキスパートシステム」「5. 機械学習」「6. ディープラーニング」の順に並んでいることが、そのまま流れの見取り図になります。解き方の手順を人が組み立てる段階、専門家の知識を人が書き出す段階、データから規則性を学ばせる段階、そして層を深く重ねる段階、という順です。人が書き下す側からデータに学ばせる側へ、重心が移ってきたと捉えると全体が一本につながります。なお、この流れを「第何次の」と数える言い方はシラバスには一度も出てきません。本ラボでも中項目の名前でそのまま呼びます。
| レベル | 動きの決まり方 | 例として語られるもの |
|---|---|---|
| 単純な制御プログラム | 条件と動作の対応を人がすべて書き切る | 設定温度で入切する温度調節 |
| 古典的な人工知能 | 場合分けや探索、蓄えた知識で対応を選ぶ | 経路を探す掃除機、診断のプログラム |
| 機械学習 | データから規則性を見つけて判断する | 迷惑メールの振り分け |
| 深層学習 | 層を深く重ねたネットワークで表現を学ぶ | 画像認識、生成AI |
- 人工知能
- シラバス「1. 人工知能の定義」のキーワード。目標では定義の暗記ではなく、具体例を用いて説明できることが求められている。
- 機械学習
- 人工知能に含まれるやり方の一つで、対応を人が書き切る代わりにデータから規則性を見つけさせるもの。
- ディープラーニング
- 機械学習に含まれるやり方の一つで、層を深く重ねたニューラルネットワークを用いるもの。深層学習ともいう。
- AI効果
- 仕組みが解明されると「単なる自動処理であって知能ではない」と受け取られ、評価が下がっていく現象。シラバスが説明できることを求めている語。
- エージェント
- 環境を観測し、目標に向けて自分で次の行動を選ぶ主体。人工知能を振る舞いの側から捉えるための語。
- 単純な制御プログラム
- 人工知能のレベルの4分類の1つ目。条件と動作の対応を人がすべて書き切ってしまうもの。
- 古典的な人工知能
- 人工知能のレベルの4分類の2つ目。場合分けが多く、探索や蓄えた知識で対応を選ぶもの。
- ImageNet
- 大量の画像に分類のラベルを付けた大規模なデータセット。「6. ディープラーニング」のキーワード。
- ILSVRC
- ImageNet を使って画像認識の精度を競った競技会。データセットである ImageNet とは役割が異なる。
- LeNet
- 手書きの数字を認識するために作られた、畳み込みを用いたニューラルネットワーク。
- ネオコグニトロン
- 人間の神経回路のはたらきに着想を得て、層を重ねて視覚の情報を段階的に扱おうとしたモデル。
- 人間の神経回路
- 「6. ディープラーニング」のキーワード。層を重ねるという発想の出どころを示すために置かれている。
- アルファ碁(AlphaGo)
- 囲碁の対局で人間のトップ棋士に勝ったプログラム。ディープラーニングの力を広く知らせた例として挙げられる。
- 生成AI
- 文章や画像などを新しく作り出すものの総称。第1.3版で「6. ディープラーニング」に入った語。
例題 シラバスは「生成AI」という語を、応用例をまとめた章ではなく、大項目「人工知能をめぐる動向」の「6. ディープラーニング」に置いている。この置き方から何が読み取れるか。
「6. ディープラーニング」の目標は「ディープラーニングがどのように発展してきたのか、その歴史を説明できる」ことである。つまりこの中項目は、個々の技術の使い方ではなく、発展の道筋を並べる場所になっている。ImageNet・ILSVRC・LeNet・ネオコグニトロン・アルファ碁(AlphaGo)と同じ列に生成AIが置かれているということは、生成AIを流行りの製品としてではなく、その道筋の到達点として位置づけている、と読める。なお、この枠には第1.2版まで「LLM(大規模言語モデル)」が置かれており、第1.3版で「生成AI」に変わった。より広い言い方に置き換わったわけで、ここからも特定の製品ではなく流れを問いたいという意図が読み取れる。
例題 この教材では、人工知能の歴史を、盛り上がった時期に番号を振って呼ぶ市販教材の言い方に合わせていない。なぜか。そのかわり、どう呼べばよいか。
市販の教材でよく使われる、盛り上がりの時期に番号を振る呼び名が、シラバス2024第1.4版の全文に一度も出てこないためである。呼び名そのものがシラバスに無い以上、それを正解にも誤答にも使うと、範囲の外の知識を問うことになってしまう。かわりに、大項目「人工知能をめぐる動向」の中項目の名前をそのまま使う。「3. 探索・推論」の時代、「4. 知識表現とエキスパートシステム」の時代、「5. 機械学習」から「6. ディープラーニング」への時代、という言い方である。この呼び方には実利もあって、それぞれの時代に何が中心だったのかが名前そのものに書いてあるため、どの用語がどの時代の話かを取り違えにくくなる。
出典:一般社団法人日本ディープラーニング協会「G検定 試験出題範囲(シラバス 2024)」第1.4版(2026年5月11日) 技術分野 人工知能とは 1. 人工知能の定義/一般社団法人日本ディープラーニング協会「G検定 試験出題範囲(シラバス 2024)」第1.4版(2026年5月11日) 技術分野 人工知能をめぐる動向 6. ディープラーニング
人工知能分野で議論される問題
フレーム問題とシンボルグラウンディング問題、チューリングテストと中国語の部屋。取り違えやすい対を、どこが違うのかで押さえます。
大項目「人工知能とは」の2つ目の中項目が「2. 人工知能分野で議論される問題」です。目標は「人工知能分野で議論されている代表的な問題について説明できる」「汎用的な人工知能の実現可能性について、いくつかの例を取り上げて説明できる」の2つです。ここに並ぶキーワードは、シンギュラリティ・シンボルグラウンディング問題・身体性・ダートマス会議・トイ・プロブレム・知識獲得のボトルネック・チューリングテスト・中国語の部屋・強いAIと弱いAI・統計的機械翻訳・フレーム問題・ルールベース機械翻訳・ローブナーコンテストの13語です。技術の作り方ではなく、人工知能に何ができて何ができないのかを問う議論が中心で、名前の似た対が多く、取り違えがそのまま失点になります。
ダートマス会議は1956年に開かれた研究会議で、artificial intelligence(人工知能)という言葉が初めて公に使われた場として語られます。ここで気をつけるのは、チューリングテストの提案は1950年の論文であって、ダートマス会議より前の別の出来事だという点です。この2つを結びつけた選択肢が用意されやすいので、年と出来事を分けて覚えます。
チューリングテストは、判定者が文字だけのやり取りで人間と機械を見分けられなければ、その機械に知能があるとみなす、という判定の方法です。要点は、知能とは何かという定義を与えたのではなく、外から見える振る舞いで判定しようという手続きを提案したところにあります。このテストを実際に競技の形で行ったのがローブナーコンテストで、こちらも同じ中項目のキーワードです。テストそのものとコンテストを混ぜないようにします。
中国語の部屋は、そのチューリングテストへの批判として出された思考実験です。中国語を知らない人が部屋に入り、マニュアルに従って記号を並べ替えて返事を返す。外から見れば中国語で受け答えしているように見えるが、その人は中国語を理解していない。つまり振る舞いが人間と区別できなくても、理解しているとは限らない、という主張です。ここは取り違えが多いところで、中国語の部屋は強いAIを支える根拠ではなく、強いAIへの反論です。向きを逆に覚えていると、選択肢を読んでそのまま引っかかります。
強いAIと弱いAIは、機械に心や理解があるかどうかで分ける区別です。強いAIは本当に理解していると考える立場、弱いAIは理解しているように振る舞う道具にすぎないと考える立場を指します。これと似て非なるのが汎用と特化の区別で、こちらはどれだけ広い範囲の仕事に使えるかという適用範囲の話です。軸がまったく違うので、適用範囲が広いことをもって心があるとは言えませんし、逆も言えません。この中項目の目標に「汎用的な人工知能の実現可能性について」とあるとおり、汎用の話題はここで扱われますが、強い弱いとは別の物差しだと分けて持っておきます。
フレーム問題は、ある行動をとったときに何が変わり何が変わらないかを、関係のあることだけに絞って有限の時間で扱えないという問題です。一言でいえば関連性の絞り込みの問題です。これと対で問われるのがシンボルグラウンディング問題で、こちらは記号と、それが指す実世界の意味とをどう結びつけるかという問題です。「シマウマ」という語と「縞のある馬」という知識を持っていても、目の前の実物と結びつくとは限らない、という形で語られます。フレーム問題は絞り込み、シンボルグラウンディング問題は接地、と短い言葉で覚えておくと取り違えません。
身体性は、知能が成り立つためには体を通して環境とやり取りする経験が必要ではないか、という立場です。シンボルグラウンディング問題に対する一つの答え方として語られます。体を持って世界に触れることが、記号と意味の結びつきを作るのだ、という筋道です。ロボットの形をしていなければ実用にならない、という主張ではないことに注意します。
トイ・プロブレムは、ルールと状態がはっきり決まった、現実の複雑さを削ぎ落とした限定的な問題を指します。迷路やパズルのようにこの形に収まる問題は解けても、条件が定まらない現実の問題には手が届かなかった、という文脈で使われます。「簡単な問題」という意味ではなく、現実を単純化した設定という意味です。フレーム問題とは別物で、トイ・プロブレムは問題設定の側、フレーム問題は現実で何を考慮すべきか決められないという側です。
知識獲得のボトルネックは、専門家が持っている知識を人手でルールの形に書き出す作業の量と難しさが壁になり、知識を蓄えるやり方が広がらなかったという問題です。ここで大事なのは、原因が計算資源の不足でもデータの不足でもなく、知識を書き出す手間そのものにあるという点です。手間を減らそうとした試みの一つが、「4. 知識表現とエキスパートシステム」に挙げられているインタビューシステムです。この語がなぜ「2. 人工知能分野で議論される問題」に置かれているのかというと、特定の製品の話ではなく、知識を人が書き下すというやり方そのものの限界を示す議論だからだと読めます。
シンギュラリティは、人工知能が人間の知能を超え、その先の変化が見通せなくなる転換点をめぐる議論です。目標にある「汎用的な人工知能の実現可能性」という論点と結びついて出てきます。「1. 人工知能の定義」にある AI効果 とはまったく別の話で、AI効果は評価が下がる現象、シンギュラリティは将来の転換点です。最後に機械翻訳の2つのやり方を押さえます。ルールベース機械翻訳は文法規則と辞書を人が書いて訳を組み立てるやり方、統計的機械翻訳は大量の対訳データの統計からもっともらしい訳を選ぶやり方です。人が書き下すやり方からデータに学ばせるやり方へという流れが、翻訳という一つの題材の中に現れています。なお統計的機械翻訳は、この中項目のほかに「27. 自然言語処理」にも挙げられています。
| 取り違えやすい対 | 一方 | もう一方 |
|---|---|---|
| フレーム問題/シンボルグラウンディング問題 | フレーム問題は、関係のあることだけに絞れない | シンボルグラウンディング問題は、記号と実世界の意味が結びつかない |
| チューリングテスト/中国語の部屋 | チューリングテストは、判定の手続きを提案したもの | 中国語の部屋は、その判定への批判として出されたもの |
| 強いAIと弱いAI/汎用と特化 | 強いか弱いかは、心や理解があるかどうかの区別 | 汎用か特化かは、使える範囲の広さの区別 |
| ダートマス会議/チューリングテスト | ダートマス会議は1956年、人工知能という語が使われた場 | チューリングテストは1950年の論文で提案された判定の方法 |
| トイ・プロブレム/フレーム問題 | トイ・プロブレムは、条件を限った問題設定のこと | フレーム問題は、現実で何を考慮すべきか決められないこと |
| AI効果/シンギュラリティ | AI効果は、仕組みが分かると評価が下がる現象 | シンギュラリティは、人間の知能を超える転換点をめぐる議論 |
- ダートマス会議
- 1956年の研究会議。artificial intelligence(人工知能)という言葉が初めて公に使われた場として語られる。
- チューリングテスト
- 文字だけのやり取りで人間と機械を見分けられなければ知能があるとみなす判定の方法。1950年の論文で提案された。知能の定義ではない。
- ローブナーコンテスト
- チューリングテストを実際に競技の形で行ったもの。テストそのものとは別の語として並んでいる。
- 中国語の部屋
- 振る舞いが人間と区別できなくても理解しているとは限らない、と主張する思考実験。強いAIへの反論として出された。
- 強いAIと弱いAI
- 機械に心や理解があるかどうかで分ける区別。適用範囲の広さで分ける汎用と特化とは軸が違う。
- フレーム問題
- ある行動で何が変わり何が変わらないかを、関係のあることだけに絞って有限の時間で扱えないという問題。関連性の絞り込みの問題。
- シンボルグラウンディング問題
- 記号と、それが指す実世界の意味とをどう結びつけるかという問題。フレーム問題と対で問われる。
- 身体性
- 知能が成り立つには体を通して環境とやり取りする経験が要るのではないか、という立場。シンボルグラウンディング問題への一つの答え方。
- トイ・プロブレム
- ルールと状態がはっきり決まった、現実の複雑さを削ぎ落とした限定的な問題。簡単な問題という意味ではない。
- 知識獲得のボトルネック
- 専門家の知識を人手で書き出す作業が膨大で、知識を蓄えるやり方が広がらなかったという問題。原因は計算資源やデータの不足ではない。
- シンギュラリティ
- 人工知能が人間の知能を超え、その先の変化が見通せなくなる転換点をめぐる議論。AI効果とは別物。
- ルールベース機械翻訳
- 文法規則と辞書を人が書いて訳を組み立てる機械翻訳のやり方。
- 統計的機械翻訳
- 大量の対訳データの統計からもっともらしい訳を選ぶやり方。この中項目と「27. 自然言語処理」の両方に載っている。
例題 「機械が人間そっくりに受け答えできたなら、その機械は理解していると言ってよいか」という問いに対して、チューリングテストと中国語の部屋はそれぞれどう答えるか。
チューリングテストの立場は、外から見える振る舞いで判定してよい、というものである。判定者が文字だけのやり取りで人間と機械を見分けられないなら、そこに知能があるとみなす。内部で何が起きているかを問わないので、知能とは何かという定義の議論を避けて、判定の手続きだけを決めた提案だといえる。中国語の部屋はこれに反対する。中国語を知らない人がマニュアルどおりに記号を並べ替えているだけでも、外からは中国語で受け答えしているように見える。だが本人は中国語を理解していない。したがって振る舞いが区別できないことは、理解があることの証拠にならない、というのが主張である。ここから、中国語の部屋は強いAIを支える根拠ではなく、強いAIへの反論だと確認できる。
例題 シンギュラリティという語は、この中項目のどの目標と結びついているか。また、AI効果とどう違うか。
この中項目の目標は2つあり、そのうちの「汎用的な人工知能の実現可能性について、いくつかの例を取り上げて説明できる」に結びついている。シンギュラリティは、人工知能が人間の知能を超え、その先の変化が見通せなくなる転換点をめぐる議論であり、汎用的な人工知能がどこまで実現しうるかを論じる場面で取り上げられる例の一つである。一方 AI効果 は「1. 人工知能の定義」に置かれた語で、仕組みが解明されると「これは知能ではない」と評価が下がっていく現象を指す。将来の転換点を論じるものと、いま起きている評価の下がり方を指すもので、話している対象そのものが違う。置かれている中項目が違うことも、区別の手がかりになる。
出典:一般社団法人日本ディープラーニング協会「G検定 試験出題範囲(シラバス 2024)」第1.4版(2026年5月11日) 技術分野 人工知能とは 2. 人工知能分野で議論される問題
探索・推論から知識、そして機械学習へ
迷路の解き方、専門家の知識を書き写したシステム、そしてデータから学ぶ側へ。3つの中項目を一本の流れで押さえます。
大項目「人工知能をめぐる動向」のうち、ここでは「3. 探索・推論」「4. 知識表現とエキスパートシステム」「5. 機械学習」の3つを扱います。この並びは、人が書き下すものが何であったかで整理できます。探索・推論では解き方の手順を人が組み立て、知識表現とエキスパートシステムでは専門家の知識を人が書き出し、機械学習では書き下すのをやめてデータに任せます。書き下す相手が「手順」から「知識」へ移り、そして「書き下すこと自体をやめる」へ移った、という順です。用語を1つずつ覚えるより、どの段階の話かをまず決めてから覚えるほうが、取り違えが減ります。
探索の話は探索木から始まります。取りうる状態を枝分かれの形で並べたものが探索木で、ハノイの塔のようにルールと状態がはっきりした題材が練習台としてシラバスに挙げられています。幅優先探索は、根に近い層から順に、同じ深さの節点をすべて調べてから次の深さへ進みます。最も浅いところにある答えを先に見つけられますが、覚えておく節点が増えやすいという性質があります。深さ優先探索は、行けるところまで一気に降りて、行き止まりで一つ戻ってやり直します。覚えておく量は少なくて済みますが、最初に見つかる答えが最も浅いものとは限りません。2つを入れ替えて覚えないよう、名前のとおり「幅を先に」「深さを先に」と読み下すのが確実です。
ブルートフォースは、取りうる手を片端からすべて調べるやり方です。答えがあれば必ず見つかりますが、手の数が増えると組み合わせが急に増えて、現実の時間では終わらなくなります。だからこそ調べる範囲を減らす工夫が要る、という流れで次の話につながります。モンテカルロ法は、乱数を使った多数の試行の結果から答えを見積もるやり方です。すべての枝を調べきれない場面で、途中から先をでたらめに進める試行を何度も繰り返し、その結果の良し悪しから手を選びます。すべて調べるブルートフォースと、乱数で試すモンテカルロ法は、調べきれない大きさへの対処のしかたが正反対だと捉えておきます。
二人が交互に指すゲームで使われるのが Mini-Max法 です。自分の番は自分にとって最も良い手が、相手の番は自分にとって最も悪い手が選ばれると考えて、先の局面の値を手前へ返していきます。αβ法は、この Mini-Max法 の探索の途中で、これ以上調べても結論が変わらないと分かった枝を打ち切り、調べる量を減らす工夫です。別の評価の考え方ではなく、Mini-Max法 の上に乗る枝刈りだ、という関係を押さえます。同じ中項目には SHRDLU と STRIPS も挙げられています。SHRDLU は、画面の中の積み木の世界を言葉での指示によって操作させた研究で、条件を限った世界でなら言葉での指示が通ることを示しました。STRIPS は、行動を「実行の前提」と「実行後に変わること」の形で書き表し、目標の状態に至る行動の並びを組み立てる考え方です。
「4. 知識表現とエキスパートシステム」の目標は、知識表現とは何か、エキスパートシステムとは何かを説明できること、そしてそれぞれの代表的な研究や手法を理解することです。知識表現の代表が意味ネットワークで、概念を点、概念どうしの関係を線で結んで知識を表します。関係の代表として、is-aの関係・has-aの関係・part-ofの関係 の3つがシラバスに並んでいます。is-a は上位と下位の関係で、「犬は動物である」のように下位の概念が上位に含まれることを表します。has-a は部分を持つ関係で、「自動車はタイヤを持つ」のように全体から部分を見ます。part-of は部分である関係で、「タイヤは自動車の部分である」のように部分から全体を見ます。has-a と part-of は同じつながりを逆向きから見たものなので、向きの取り違えに注意してください。関連して、オントロジーは概念とその関係の決め方そのものを整理する研究、セマンティックWeb はWeb上の情報に意味づけを与えて機械が扱えるようにする構想です。
エキスパートシステムは、専門家の知識をルールの形で書き込み、問いに答えさせる仕組みです。シラバスには実例が並んでいます。DENDRAL は、質量分析のデータから未知の有機化合物の分子構造を推定するもので、分野は化学です。マイシン(MYCIN)は、細菌感染症を診断し、それに合う抗生物質を推薦するもので、分野は医療です。この2つは名前と分野の組合せがそのまま問われるので、対にして覚えます。イライザ(ELIZA)は、入力された文のパターンに合わせて返事を組み立てる対話のプログラムで、診断をするものではありません。Cycプロジェクトは、人間が当たり前に持っている一般常識を片端から書き込もうとする長期の取り組みです。ワトソンは質問応答(Question-Answering)の仕組みで、クイズ番組で人間の解答者と競いました。東ロボくんは大学入試の問題に挑んだプロジェクトです。インタビューシステムは、専門家から知識を聞き出す手間を減らそうとした試みで、知識獲得のボトルネックへの対策にあたります。データマイニングは大量のデータから規則性を掘り出すこと、ウェブマイニングはその対象をWeb上の情報にしたものです。
「5. 機械学習」の目標には「機械学習とルールベース手法の差異、およびメリットデメリットについて説明できる」「機械学習が注目されるようになった背景を説明できる」が並んでいます。ルールベース手法は、どういう条件のときにどう結論するかを人が書き下します。書いたとおりに動くので判断の理由を示しやすい反面、例外が増えるほど書ききれなくなり、書き手の手間が上限になります。機械学習はデータから規則性を見つけるので、書ききれない量の場合分けにも対応できますが、そのぶん判断の理由を示しにくく、質と量のそろったデータが要ります。どちらが優れているという話ではなく、手間の置き場所と説明のしやすさが入れ替わっている、と捉えます。注目されるようになった背景として、この中項目にはビッグデータが挙げられています。応用例として並ぶのが、スパムフィルタ、レコメンデーションエンジン、統計的自然言語処理です。
この中項目でもう一つ押さえるのが次元の呪いです。扱う特徴の数、つまり次元が増えるほど、その空間の中でデータがまばらになり、同じ密度を保つのに必要なデータの量が急激に増えていきます。点どうしの距離の差も付きにくくなるため、距離をもとに判断する手法が効きにくくなります。ここで注意したいのが、シラバスがこの語を「7. 教師あり学習」ではなく「5. 機械学習」に置いていることです。特定の学習手法の話ではなく、データから学ぶというやり方そのものにつきまとう性質として扱われている、と読めます。中項目の場所を問われることがあるので、置き場所ごと覚えておいてください。
| 名前 | 何をするものか | 置かれている中項目 |
|---|---|---|
| SHRDLU | 画面の中の積み木の世界を、言葉での指示で操作する | 3. 探索・推論 |
| DENDRAL | 質量分析のデータから有機化合物の分子構造を推定する | 4. 知識表現とエキスパートシステム |
| マイシン(MYCIN) | 細菌感染症を診断し、合う抗生物質を推薦する | 4. 知識表現とエキスパートシステム |
| イライザ(ELIZA) | 入力された文のパターンに合わせて返事を組み立てる | 4. 知識表現とエキスパートシステム |
| Cycプロジェクト | 人間の一般常識を片端から書き込もうとする長期の取り組み | 4. 知識表現とエキスパートシステム |
| ワトソン | 質問応答(Question-Answering)を行い、クイズ番組で競った | 4. 知識表現とエキスパートシステム |
| 東ロボくん | 大学入試の問題に挑んだプロジェクト | 4. 知識表現とエキスパートシステム |
- 探索木
- 取りうる状態を枝分かれの形で並べたもの。探索の手順はこの木をどうたどるかで整理される。
- ハノイの塔
- ルールと状態がはっきりした題材で、探索の練習台としてシラバスに挙げられている。
- 幅優先探索
- 根に近い層から順に、同じ深さの節点をすべて調べてから次の深さへ進む。最も浅い答えを先に見つけられる。
- 深さ優先探索
- 行けるところまで一気に降り、行き止まりで戻ってやり直す。覚えておく量は少ないが、最初の答えが最も浅いとは限らない。
- ブルートフォース
- 取りうる手を片端からすべて調べるやり方。確実だが、手の数が増えると現実の時間で終わらなくなる。
- モンテカルロ法
- 乱数を使った多数の試行の結果から答えを見積もるやり方。調べきれない大きさへの対処の一つ。
- Mini-Max法
- 交互に指すゲームで、自分の番は自分に最も良い手、相手の番は自分に最も悪い手が選ばれると考えて局面を評価する方法。
- αβ法
- Mini-Max法 の探索で、結論が変わらないと分かった枝を打ち切って調べる量を減らす工夫。別の評価の考え方ではない。
- SHRDLU
- 画面の中の積み木の世界を、言葉での指示によって操作させた研究。
- STRIPS
- 行動を実行の前提と実行後に変わることの形で書き表し、目標の状態に至る行動の並びを組み立てる考え方。
- 意味ネットワーク
- 概念を点、概念どうしの関係を線で結んで知識を表す形。知識表現の代表例。
- is-aの関係・has-aの関係・part-ofの関係
- is-a は上位と下位、has-a は部分を持つ、part-of は部分である。has-a と part-of は同じつながりを逆向きから見たもの。
- オントロジー
- 概念とその関係の決め方そのものを整理する研究。
- セマンティックWeb
- Web上の情報に意味づけを与え、機械が扱えるようにしようという構想。
- DENDRAL
- 質量分析のデータから未知の有機化合物の分子構造を推定する、化学の分野のエキスパートシステム。
- マイシン(MYCIN)
- 細菌感染症を診断し、それに合う抗生物質を推薦する、医療の分野のエキスパートシステム。
- イライザ(ELIZA)
- 入力された文のパターンに合わせて返事を組み立てる対話のプログラム。診断をするものではない。
- Cycプロジェクト
- 人間が当たり前に持っている一般常識を片端から書き込もうとする長期の取り組み。
- ワトソン
- 質問応答(Question-Answering)の仕組み。クイズ番組で人間の解答者と競った。
- 東ロボくん
- 大学入試の問題に挑んだプロジェクト。
- インタビューシステム
- 専門家から知識を聞き出す手間を減らそうとした試み。知識獲得のボトルネックへの対策にあたる。
- データマイニング
- 大量のデータから規則性を掘り出すこと。対象をWeb上の情報にしたものがウェブマイニング。
- ビッグデータ
- 機械学習が注目されるようになった背景として「5. 機械学習」に挙げられている語。
- スパムフィルタ
- 迷惑メールを振り分ける仕組み。機械学習の応用例として挙げられている。
- レコメンデーションエンジン
- 好みに合いそうなものを勧める仕組み。機械学習の応用例として挙げられている。
- 統計的自然言語処理
- 言葉の扱いを、人が書いた規則ではなく統計にもとづいて行うやり方。第1.3版で「5. 機械学習」に追加された。
- 次元の呪い
- 扱う特徴の数が増えるほど空間の中でデータがまばらになり、必要なデータ量が急激に増える現象。シラバスでは「5. 機械学習」に置かれている。
例題 取りうる手をすべて調べれば必ず正しい答えが出るのに、モンテカルロ法のように乱数で試すやり方が必要になるのはなぜか。
すべて調べるブルートフォースは、答えがあれば必ず見つけるという意味で確実である。問題は時間で、一手ごとの選択肢が増えると探索木の枝は掛け算で増えていくため、現実的な時間では最後まで調べきれなくなる。そこで、調べる量を減らす方向の工夫と、調べきらずに見積もる方向の工夫が出てくる。前者の代表がαβ法で、これ以上調べても結論が変わらないと分かった枝を打ち切る。後者の代表がモンテカルロ法で、途中から先を乱数で進める試行を何度も繰り返し、その結果の良し悪しから手の見込みを見積もる。どちらも「全部は無理だ」という同じ事情から出てきた工夫だが、片方は正しさを保ったまま量を削り、もう片方は正しさの保証を手放して見積もりに切り替えている、という違いがある。
例題 意味ネットワーク、オントロジー、セマンティックWeb の3つは、どうつながっているか。
意味ネットワークは、概念を点、概念どうしの関係を線で結んで知識を表す形そのものである。ここで使われる関係の代表が is-aの関係・has-aの関係・part-ofの関係 で、シラバスにもこの3つが並んでいる。オントロジーは、その一段上の話で、どんな概念を立て、どんな関係を認めるのかという決め方そのものを整理する研究にあたる。同じ「タイヤ」を誰が書いても同じ位置に置けるようにするには、書き方の取り決めが要るからである。セマンティックWeb は、その取り決めをWeb全体に広げ、ページに書かれた情報へ機械が扱える形の意味づけを与えようという構想である。個々の知識の表し方、その表し方の取り決め、取り決めをWebに適用する構想、という順で並べると3つの関係がつかめる。
出典:一般社団法人日本ディープラーニング協会「G検定 試験出題範囲(シラバス 2024)」第1.4版(2026年5月11日) 技術分野 人工知能をめぐる動向 3. 探索・推論/一般社団法人日本ディープラーニング協会「G検定 試験出題範囲(シラバス 2024)」第1.4版(2026年5月11日) 技術分野 人工知能をめぐる動向 4. 知識表現とエキスパートシステム/一般社団法人日本ディープラーニング協会「G検定 試験出題範囲(シラバス 2024)」第1.4版(2026年5月11日) 技術分野 人工知能をめぐる動向 5. 機械学習
機械学習の手法と評価
教師あり学習 回帰と分類を分ける道具
正解つきのデータから予測の規則を学ぶのが教師あり学習です。回帰と分類の違い、決定木とアンサンブル、SVM、そして時系列のARモデルまでを一続きに整理します。
教師あり学習は、入力になる特徴量と、その答えである教師データのペアを与えて、入力から答えを言い当てる規則を学ばせるやり方です。シラバスはこの中項目の目標の先頭に「教師あり学習には、特徴量と教師データのペアが必要であることを理解する」と置いています。裏を返せば、正解が用意できないデータしか手元に無い場面では、そもそもこの枠組みに乗りません。ここが教師なし学習や強化学習との分かれ道になります。
教師あり学習が扱う問題は、大きく回帰問題と分類問題に分かれます。回帰問題は売上や気温のような連続値を予測するもの、分類問題は迷惑メールかどうか、どの品種かといった離散的なクラスを予測するものです。クラスが3つ以上あるものは多クラス分類と呼ばれます。線形回帰は回帰問題の基本形で、説明変数が1つのものを単回帰分析、2つ以上のものを重回帰分析といいます。
ここで最初のつまずきどころが来ます。ロジスティック回帰は、名前に「回帰」が付いていますが分類に使う手法です。線形の計算結果を確率の形に押し込んで、そのクラスに属する確率として読むところが要点になります。名前だけで回帰問題の手法だと決めつけると、四択でそのまま落とされます。シラバスでも線形回帰とロジスティック回帰は同じ「7. 教師あり学習」の中に並んでいますが、役割は回帰と分類で分かれています。
決定木は、特徴量に対する条件分岐を木の形に並べてデータを絞り込んでいく手法です。どの条件でどちらへ進んだかを人が読み取れるので、説明のしやすさでは群を抜きます。ただし木を深く育てるほど訓練データの細かい癖まで覚えてしまい、単体では過学習しやすいという弱点があります。そこで、木を1本で使うのではなく大量に束ねる発想が出てきます。
多数のモデルを束ねて1つの答えを出すやり方をアンサンブル学習といい、束ね方に大きく2通りあります。バギングは、ブートストラップサンプリングという重複を許した抽出で少しずつ違う訓練データを作り、そこから作った学習器を並列に、互いに独立に学習させて多数決や平均をとります。ランダムフォレストがその代表で、決定木を大量に並列に育てます。
もう一方のブースティングは、学習器を逐次に足していきます。前の学習器が間違えた例を重く扱いながら次の学習器を作るので、順番に依存し、並列には作れません。勾配ブースティングがその代表です。並列のバギングと逐次のブースティング、この対比はほぼ必ず問われます。ランダムフォレストがどちらの仲間かも合わせて覚えてください。
サポートベクターマシン(SVM)は、境界と最も近いデータ点との間隔、すなわちマージンが最大になる位置に境界を引きます。これがマージン最大化です。まっすぐな境界では分けられないデータは、高次元へ写してから分ければよいのですが、写した先の座標をまともに計算すると重くなります。そこで写像後の内積だけをカーネル関数で直接求めるのがカーネルトリックで、座標を計算せずに非線形な分離ができます。
最後に時系列です。自己回帰モデル(ARモデル)は、1つの時系列の現在の値を、その系列自身の過去の値で説明します。ベクトル自己回帰モデル(VARモデル)は、複数の時系列を並べて、互いの過去の値で説明し合う形に広げたものです。1本か複数本か、という違いで覚えておくと取り違えません。
教師あり学習で手法を選ぶときの順番
1. 予測したいものは連続値か、クラスか
連続値 -> 回帰問題(線形回帰、単回帰分析、重回帰分析)
クラス -> 分類問題(ロジスティック回帰、決定木、SVM)
2. 1本のモデルで足りるか
足りない -> アンサンブル学習
並列に束ねる -> バギング(ランダムフォレスト)
逐次に足す -> ブースティング(勾配ブースティング)
3. 予測したいものが時間に沿って並んでいるか
1系列だけ -> ARモデル
複数系列 -> VARモデル
| 手法 | 何をする道具か | 覚えどころ | 取り違えやすい相手 |
|---|---|---|---|
| 線形回帰 | 連続値を予測する | 説明変数が1つで単回帰、複数で重回帰 | ロジスティック回帰 |
| ロジスティック回帰 | クラスを予測する | 名前は回帰でも用途は分類 | 線形回帰 |
| 決定木 | 条件分岐で予測する | 読みやすいが単体では過学習しやすい | ランダムフォレスト |
| ランダムフォレスト | 決定木を束ねる | バギングの代表で並列に育てる | 勾配ブースティング |
| 勾配ブースティング | 学習器を足していく | ブースティングの代表で逐次に足す | ランダムフォレスト |
| サポートベクターマシン(SVM) | 境界を引く | マージン最大化とカーネルトリック | 決定木 |
| 自己回帰モデル(ARモデル) | 時系列を予測する | 1系列を自身の過去で説明、複数ならVAR | ベクトル自己回帰モデル(VARモデル) |
- 教師あり学習
- 特徴量と教師データ(正解)のペアを与えて、入力から答えを予測する規則を学ばせる枠組み。ペアが必要であることがシラバスの目標に明記されている。
- 回帰問題
- 売上や気温のような連続値を予測する問題。線形回帰が基本形。
- 分類問題
- 離散的なクラスのどれに属するかを予測する問題。クラスが3つ以上あるものが多クラス分類。
- 単回帰分析
- 説明変数が1つの回帰分析。説明変数が2つ以上になると重回帰分析と呼ぶ。
- ロジスティック回帰
- 名前に反して分類に使う手法。線形の計算結果を確率の形に変換し、クラスに属する確率として読む。
- 決定木
- 条件分岐の木でデータを絞り込む手法。分岐の条件を人が読み取れる一方、単体では過学習しやすい。
- アンサンブル学習
- 複数のモデルを束ねて1つの答えを出す考え方。束ね方の代表がバギングとブースティング。
- ブートストラップサンプリング
- 重複を許して元データから標本を取り直す方法。バギングで少しずつ違う訓練データを作るのに使う。
- バギング
- 学習器を並列に、互いに独立に学習させて多数決や平均をとる束ね方。ランダムフォレストが代表例。
- ブースティング
- 前の学習器が誤った例を重く扱いながら学習器を逐次に足していく束ね方。勾配ブースティングが代表例。
- ランダムフォレスト
- ブートストラップサンプリングで作った多数の決定木を並列に育てる、バギングの代表例。
- マージン最大化
- SVMが、境界と最も近いデータ点との間隔が最大になる位置に境界を引くこと。
- カーネルトリック
- 高次元へ写した後の座標を計算せず、内積だけをカーネル関数で直接求めて非線形な分離を行う工夫。
- 自己回帰モデル(ARモデル)
- 1つの時系列の現在の値を、その系列自身の過去の値で説明するモデル。複数系列に広げたものがVARモデル。
例題 例題:ある通販サイトで「翌月の売上金額」を当てたい場合と、「この注文が不正利用かどうか」を当てたい場合。それぞれどちらの問題か。
前者は金額という連続値を当てるので回帰問題です。後者は不正か正常かというクラスを当てるので分類問題になります。同じ教師あり学習でも、答えが連続値かクラスかで問題の種類が分かれ、選ぶ手法も変わります。なお名前に引きずられてロジスティック回帰を回帰問題の側に置かないでください。あれは分類の道具です。
例題 例題:「ランダムフォレストは、前の木の誤りを直しながら木を1本ずつ足していく手法だ」という説明は正しいか。
正しくありません。それはブースティングの説明です。ランダムフォレストはブートストラップサンプリングで作った多数の決定木を並列に、互いに独立に育てて多数決や平均をとる、バギングの代表例です。逐次に足していくのは勾配ブースティングなどブースティングの側で、並列と逐次を入れ替えた記述が定番の誤りになります。
出典:一般社団法人日本ディープラーニング協会「G検定 試験出題範囲(シラバス 2024)」第1.4版(2026年5月11日) 技術分野 機械学習の概要 7. 教師あり学習
教師なし学習と強化学習 正解が無いところで学ぶ
正解ラベルが無くても学べる道はふたつ。データの構造そのものを見つける教師なし学習と、報酬を手がかりに行動を直していく強化学習を、まとめて押さえます。
教師なし学習は、正解ラベルを持たず、特徴量だけを与えてデータそのものが持つ構造や規則を見つけさせるやり方です。シラバスの目標にも「教師なし学習には、特徴量のみが必要であることを理解する」と書かれています。答え合わせをする相手がいないので、出てきた結果が何を意味するのかは人が解釈することになります。ここが教師あり学習との一番大きな違いです。
代表的な仕事のひとつがクラスタリング、つまり似たものどうしをまとめる作業です。k-means法は、クラスタ数kをあらかじめ決めておき、各点を最も近い重心に割り当てる操作と重心の再計算を繰り返します。非階層の手法で、樹形図は作りません。一方ウォード法は階層的クラスタリングで、近いものから順に併合していく過程をデンドログラム(樹形図)として描けます。何個に分けるかを後から決めたいならこちらです。
もうひとつの柱が次元削減です。主成分分析(PCA)は、分散が最大になる方向に軸を取り直して情報の損失を抑えながら次元を落とす線形の手法です。t-SNEは近い点どうしの近さを保つように低次元へ写す非線形の手法で、2次元や3次元での可視化によく使われます。多次元尺度構成法(MDS)は点どうしの距離関係を保つ配置を探し、特異値分解(SVD)は行列を分解する形で成分を取り出します。PCAは線形、t-SNEは非線形という対比が問われます。
文書を扱う場面ではトピックモデルが出てきます。1つの文書がいくつかの話題の混ざり物だとみなし、その話題の割合を推定する考え方で、潜在的ディリクレ配分法(LDA)が代表です。どの話題が何個あるかを人が用意する必要はなく、単語の出方から話題を浮かび上がらせます。
推薦の場面では協調フィルタリングが使われます。似た好みの利用者が高く評価したものを勧める、あるいは一緒に買われている商品を勧める、という具合に評価の履歴を手がかりにします。ここで避けられないのがコールドスタート問題で、新しい利用者や新しい商品には履歴が無く、手がかりが取れません。商品の説明文や属性そのものを手がかりにするコンテンツベースフィルタリングは、この弱点を補う方向の考え方です。
ここから強化学習に移ります。強化学習は、環境の中でエージェントが行動し、状態が変わり、報酬を受け取る、というやり取りを繰り返しながら、累積の報酬が大きくなる方策を学びます。この枠組みを数学的に整えたものがマルコフ決定過程です。学習の手がかりは1手ごとの正解ラベルではなく報酬である、という点をまず押さえてください。遠い将来の報酬をどれだけ軽く見るかを決めるのが割引率で、1に近いほど先を見る学習になります。
シラバスは「価値関数の学習と、方策の学習の2つの代表的なアプローチを理解する」ことを目標に挙げています。前者はその状態の良さを表す状態価値関数や、その状態でその行動をとる良さを表す行動価値関数を推定してから行動を選ぶやり方で、Q学習とSARSAが代表です。両者の違いは更新に何を使うかで、Q学習は次の状態で価値が最大の行動を使い、SARSAは実際に選んだ次の行動を使います。後者は方策そのものをパラメータで表して直接更新するやり方で、方策勾配法やREINFORCEが代表です。Actor-Criticは方策を担うActorと価値を担うCriticを組み合わせ、両方を併せ持ちます。
最後に探索と活用の兼ね合いです。今いちばん良さそうな手ばかり選んでいると、まだ試していない良い手を見つけられません。バンディットアルゴリズムはこの問題を扱う枠組みで、ε-greedy方策は一定の確率εでランダムに試し、残りで最も良さそうな手を選びます。UCB方策は、推定の不確かさが大きい手ほど選ばれやすくなる形で探索を促します。
強化学習の用語を1本の流れに並べる
環境の中でエージェントが行動する
-> 状態が変わり、報酬を受け取る(マルコフ決定過程)
-> 遠い将来の報酬ほど割引率で小さく評価する
学び方は大きく2つ
A. 価値関数を学ぶ
状態価値関数(その状態の良さ)
行動価値関数(その状態でその行動をとる良さ)
代表手法: Q学習, SARSA
B. 方策を直接学ぶ
代表手法: 方策勾配法, REINFORCE
A と B を組み合わせたもの: Actor-Critic
まだ試していない手を試すか(探索)、今よい手を選ぶか(活用)
代表手法: ε-greedy 方策, UCB 方策(バンディットアルゴリズム)
| 手法 | 分類 | 取り出すもの | 覚えどころ |
|---|---|---|---|
| k-means法 | クラスタリング | 指定した数の塊 | kを先に決める。非階層で樹形図は描かない |
| ウォード法 | クラスタリング | 入れ子になった塊 | 階層的。デンドログラム(樹形図)を描ける |
| 主成分分析(PCA) | 次元削減 | 分散が最大の方向の軸 | 線形の変換 |
| t-SNE | 次元削減 | 近さを保った低次元の配置 | 非線形。可視化に向く |
| 多次元尺度構成法(MDS) | 次元削減 | 距離関係を保った配置 | 点どうしの距離が出発点 |
| 特異値分解(SVD) | 次元削減 | 行列を分解した成分 | 行列の形で扱う |
| 潜在的ディリクレ配分法(LDA) | トピックモデル | 文書に潜む話題の割合 | 文書を話題の混ざり物とみなす |
| 協調フィルタリング | 推薦 | 似た利用者や商品の評価 | 履歴が無いとコールドスタート問題 |
- 教師なし学習
- 特徴量のみを与えて、データそのものが持つ構造や規則を見つけさせる枠組み。正解ラベルは使わない。
- k-means法
- クラスタ数kを先に決め、最も近い重心への割り当てと重心の再計算を繰り返す非階層クラスタリング。樹形図は作らない。
- ウォード法
- 近いものから順に併合していく階層的クラスタリング。併合の過程をデンドログラム(樹形図)として描ける。
- 主成分分析(PCA)
- 分散が最大になる方向へ軸を取り直す線形の次元削減。
- t-SNE
- 近い点どうしの近さを保つように低次元へ写す非線形の次元削減。可視化に向く。
- 潜在的ディリクレ配分法(LDA)
- 文書をいくつかの話題の混ざり物とみなして話題の割合を推定する、トピックモデルの代表。
- 協調フィルタリング
- 利用者どうし、または商品どうしの評価の似かたを手がかりに推薦する方法。
- コールドスタート問題
- 履歴がまだ無い新しい利用者や商品には手がかりが取れず、推薦を出しにくいという協調フィルタリングの弱点。
- 強化学習
- 環境とのやり取りで受け取る報酬を手がかりに、累積の報酬が大きくなる方策を学ぶ枠組み。正解ラベルは使わない。
- 割引率
- 遠い将来の報酬をどれだけ軽く見るかを決める値。1に近いほど先まで見る学習になる。
- 行動価値関数
- その状態でその行動をとることの良さを表す関数。状態そのものの良さを表すのが状態価値関数。
- Q学習とSARSA
- どちらも行動価値関数を更新する手法。Q学習は次の状態で価値が最大の行動を使い、SARSAは実際に選んだ次の行動を使う。
- 方策勾配法
- 方策そのものをパラメータで表して直接更新するアプローチ。REINFORCEが代表例。
- Actor-Critic
- 方策を担うActorと価値を担うCriticを組み合わせ、方策の学習と価値関数の学習を併せ持つ手法。
- ε-greedy方策
- 一定の確率εでランダムに試し、残りの確率で推定価値が最大の手を選ぶ、探索と活用の兼ね合いのとり方。
例題 例題:会員1万人を、事前に数を決めずにグループへ分け、どのグループとどのグループが近いのかも見たい。どの手法が向くか。
ウォード法などの階層的クラスタリングが向きます。併合していく過程をデンドログラム(樹形図)として描けるので、どの高さで切るかを見ながらグループ数を後から決められ、グループどうしの近さも読み取れます。k-means法はクラスタ数kを先に決めてしまう非階層の手法で、樹形図は描きません。まずk-means法で速く当たりを付け、構造を見たいときにウォード法へ移る、という使い分けもできます。
例題 例題:「強化学習は、1手ごとに正解の手を教えてもらいながら学ぶ教師あり学習の一種だ」という説明は正しいか。
正しくありません。強化学習が受け取るのは1手ごとの正解ではなく、環境から返ってくる報酬です。しかも報酬はすぐに返るとは限らないため、遠い将来の報酬を割引率で小さく評価しながら、累積の報酬が大きくなる方策を探します。正解ラベルとのペアを前提にする教師あり学習とは、学習の手がかりそのものが違います。
出典:一般社団法人日本ディープラーニング協会「G検定 試験出題範囲(シラバス 2024)」第1.4版(2026年5月11日) 技術分野 機械学習の概要 8. 教師なし学習/同 技術分野 機械学習の概要 9. 強化学習
モデルの選択・評価と、支えになる統計
作ったモデルが本当に使えるのかを測る物差しの話です。混同行列から出る指標、ROC曲線とAUC、交差検証、情報量規準、そして土台になる統計の基本をまとめます。
モデルに求められているのは、訓練データをうまく再現することではなく、まだ見ていないデータでも当たることです。この力を汎化性能といいます。訓練データに合わせ込みすぎて細かい癖まで覚えてしまい、新しいデータで成績が落ちる状態が過学習です。訓練データでの成績だけを見ていては過学習に気づけないので、必ず学習に使っていないデータで測ります。
測り方の基本は2つです。ホールドアウト検証は、手元のデータを訓練用と検証用に一度だけ分けます。単純で計算も軽い代わりに、たまたまどう分かれたかに結果が左右されます。k-分割交差検証は、データをk個に分け、1つを検証、残りを学習に使う手続きをk回繰り返して結果を平均します。全部のデータが一度ずつ検証に回るので、分割の運に振り回されにくく、データが少ないときほど効きます。
分類の評価は混同行列から始まります。実際に陽性か陰性か、モデルが陽性と予測したか陰性と予測したかの組合せで、真陽性・偽陽性・偽陰性・真陰性の4つに数えます。ここから出る指標はどれも、この4つの数のどれを分子に、どれを分母に置くかの違いにすぎません。数字を暗記するのではなく、分母に何を置いているかで区別してください。
正解率は、全件のうち正しく当てた割合です。適合率は、陽性と予測したもののうち実際に陽性だった割合で、分母が予測側にあります。再現率は、実際に陽性のもののうち拾えた割合で、分母が実際側にあります。この2つを逆に覚える誤りが最も多いので、分母が予測か実際かで思い出してください。誤検出を減らしたいときは適合率、見逃しを減らしたいときは再現率を重く見ます。F値はこの2つの調和平均で、算術平均ではありません。調和平均は小さいほうへ引き寄せられるので、片方だけ高くても数字が伸びません。
正解率にはわなもあります。陽性が全体の1%しかないデータでは、すべて陰性と答えるだけで正解率は99%になりますが、陽性は1件も拾えていません。クラスの数が釣り合っていないときは、正解率だけを見て判断しないことです。閾値の取り方によらず全体を見たいときはROC曲線を描きます。縦軸に真陽性率、横軸に偽陽性率をとり、その下の面積がAUCです。AUCは1に近いほど良く、0.5はでたらめに判定したのと同じ水準です。なお縦軸を適合率、横軸を再現率にすると、これとは別の曲線になります。
回帰の評価には、平均二乗誤差(MSE)、二乗平均平方根誤差(RMSE)、平均絶対値誤差(MAE)を使います。MSEは誤差を二乗して平均したもので、大きな外れをより強く罰します。その平方根がRMSEで、誤差ともとの単位がそろうので読みやすくなります。MAEは誤差の絶対値の平均で、外れ値の影響がMSEほど強く出ません。同じ予測でも、どの物差しを使うかで良し悪しの見え方が変わります。
モデルの複雑さそのものを罰する物差しもあります。赤池情報量規準(AIC)とベイズ情報量規準(BIC)は、データへの当てはまりの良さと、パラメータを増やしたことへの罰則を足し合わせた指標で、どちらも値が小さいほど良いモデルとみなします。大きいほど良い、と覚え違えないでください。必要以上に複雑な説明を持ち込まないというオッカムの剃刀の考え方と、同じ向きを向いた道具です。
土台には統計の基本があります。代表値には平均・中央値・最頻値があり、外れ値があるときに大きく動くのは平均です。ばらつきは分散と標準偏差で見ます。データがどんな形で散らばっているかは確率分布で表し、正規分布はその代表で、確率変数の平均的な値が期待値です。2つの量が一緒に動く度合いは共分散、それを単位によらない形に直したものが相関係数ですが、相関があるからといって因果があるとは限りません。共通の要因があるために関係の無い2つが一緒に動くことを疑似相関といいます。ほかに、ある条件のもとでの確率を表す条件付き確率、点どうしの近さを測るユークリッド距離やマハラノビス距離、向きの近さを測るコサイン類似度、当てはめの基準となる最小二乗法や最尤法、検定で立てる帰無仮説と対立仮説も、この中項目に並んでいます。
混同行列の置き方と、指標の作り方
実際に陽性 実際に陰性
予測が陽性 TP FP
予測が陰性 FN TN
正解率 = (TP + TN) / (TP + FP + FN + TN)
適合率 = TP / (TP + FP) 分母は「陽性と予測した数」
再現率 = TP / (TP + FN) 分母は「実際に陽性の数」
F値 = 2 * 適合率 * 再現率 / (適合率 + 再現率) 調和平均
ROC 曲線: 縦軸 真陽性率, 横軸 偽陽性率。その下の面積が AUC
AIC, BIC: 値が小さいほうが良いモデル
| 指標 | 分子 | 分母 | 重く見たい場面 |
|---|---|---|---|
| 正解率 | 真陽性と真陰性の和 | 全件 | クラスの数が釣り合っているとき |
| 適合率 | 真陽性 | 真陽性と偽陽性の和(陽性と予測した件数) | 誤検出を減らしたいとき |
| 再現率 | 真陽性 | 真陽性と偽陰性の和(実際に陽性の件数) | 見逃しを減らしたいとき |
| F値 | 適合率と再現率の調和平均 | 同左(比を組み合わせた値) | 誤検出と見逃しの釣り合いを見たいとき |
- 汎化性能
- まだ見ていないデータに対しても当たる力。モデルの評価はここを推定するために行う。
- 過学習
- 訓練データに合わせ込みすぎて細かい癖まで覚え、新しいデータで成績が落ちる状態。
- ホールドアウト検証
- 手元のデータを訓練用と検証用に一度だけ分ける検証方法。軽いが分割の仕方に左右されやすい。
- k-分割交差検証
- データをk個に分け、1つを検証、残りを学習に使う手続きをk回繰り返して平均する検証方法。
- 混同行列
- 真陽性・偽陽性・偽陰性・真陰性の4つの数え方をまとめた表。分類の評価指標はここから作られる。
- 適合率
- 陽性と予測したもののうち実際に陽性だった割合。分母は予測側。誤検出を減らしたいときに重く見る。
- 再現率
- 実際に陽性のもののうち拾えた割合。分母は実際側。見逃しを減らしたいときに重く見る。
- F値
- 適合率と再現率の調和平均。算術平均ではなく、片方だけが高くても値は伸びない。
- ROC曲線・AUC
- 縦軸に真陽性率、横軸に偽陽性率をとって閾値を動かしながら描く曲線がROC曲線。その下の面積がAUCで、1に近いほど良い。
- MSE・RMSE・MAE
- 回帰の誤差の物差し。MSEは誤差の二乗の平均、RMSEはその平方根で単位がそろう、MAEは誤差の絶対値の平均。
- AIC・BIC
- 当てはまりの良さとパラメータ数への罰則を足し合わせた情報量規準。どちらも値が小さいほど良い。
- オッカムの剃刀
- 必要以上に複雑な説明を持ち込まないという指針。情報量規準が罰則を置く考え方と同じ向き。
- 代表値
- 平均・中央値・最頻値。外れ値があるときに大きく引っ張られるのは平均で、中央値は動きにくい。
- 疑似相関
- 共通の要因があるために、直接の因果が無い2つの間にも相関が現れること。相関は因果を意味しない。
例題 例題:真陽性が9件、偽陽性が1件、偽陰性が41件だった。適合率と再現率はいくつで、どう読むべきか。
適合率は9を、陽性と予測した10で割って0.90です。再現率は9を、実際に陽性の50で割って0.18です。陽性だと言い切ったものはほぼ当たっているのに、実際の陽性の8割以上を見逃しています。慎重すぎるモデルの典型です。F値は2に0.90と0.18の積を掛けた値を、0.90と0.18の和で割って0.30となり、片方だけが高くても数字が伸びないことが分かります。
例題 例題:訓練データでの正解率が99%なのに、新しいデータでは60%しか当たらない。何が起きていて、どう確かめるべきか。
訓練データの細かい癖まで覚えてしまった過学習が疑われます。求められているのは訓練データの再現ではなく、未知のデータに対する汎化性能です。手元のデータを一度だけ分けるホールドアウト検証か、k個に分けてk回評価して平均するk-分割交差検証で、学習に使っていないデータでの成績を必ず測ってください。データが少ないときほど、分割の運に左右されにくい交差検証が効きます。
出典:一般社団法人日本ディープラーニング協会「G検定 試験出題範囲(シラバス 2024)」第1.4版(2026年5月11日) 技術分野 機械学習の概要 10. モデルの選択・評価/同 技術分野 AI に必要な数理・統計知識 37. AI に必要な数理・統計知識
ディープラーニングの手法と応用
ニューラルネットワークの土台と学習の仕組み
単純パーセプトロンの限界から、活性化関数の選び方、誤差関数、誤差逆伝播法までを一本の線でつなぎます。
ニューラルネットワークは、人間の神経回路をおおまかにまねた計算の仕組みです。データを受け取る入力層、答えを出す出力層、そのあいだに置かれる隠れ層という3種類の層が並び、層と層のあいだはそれぞれの重みでつながっています。入力層と出力層だけからなる最も単純な形を単純パーセプトロン、隠れ層を持つものを多層パーセプトロンといいます。ディープラーニングとは、この隠れ層を何層も重ねたニューラルネットワークを使う手法のことです。層を深くすると、前の層が見つけた特徴を次の層がさらに組み合わせられるようになり、人が特徴を設計しなくてもデータのほうから特徴が立ち上がってきます。
単純パーセプトロンには、線形分離可能な問題しか解けないという有名な限界があります。平面に置いた点を1本の直線で2つに切り分けられる場合しか正しく分類できない、という意味です。この限界をはっきり示したのが排他的論理和、いわゆるXORでした。XORの真理値表を平面に描くと、出力が1になる点と0になる点が対角線上に交互に並ぶので、どこに直線を引いても分けられません。隠れ層を1つ加えて多層パーセプトロンにすると境界を折り曲げられるようになり、XORも表現できるようになります。XORが解けないのはどちらかという問いは繰り返し出るので、単純パーセプトロンのほうだと覚えてください。
ディープラーニングの学習は、行列とベクトルのかけ算と足し算を膨大な回数繰り返す計算です。CPUは汎用的な処理を順番に高速にこなすことを得意とする演算装置で、強力なコアを少数だけ持ちます。GPUはもともと画像処理のために作られた装置で、単純な演算を行う小さなコアを大量に持ち、同じ計算を一斉に並列で回すことに向いています。ディープラーニングの計算はまさにその形をしているので、GPUを使うと学習にかかる時間が大きく縮みます。TPUはディープラーニングのテンソル演算に的をしぼって設計された装置で、用途を限る代わりに効率をさらに高めています。この3つの特徴を説明できること、GPUやTPUが学習や推論に適する理由を説明できることが、シラバスの目標に挙げられています。
各ユニットは、入力に重みをかけて足し合わせた値を活性化関数に通してから次の層へ渡します。活性化関数がなければ、何層重ねても全体はひとつの線形変換に押しつぶされてしまい、深くする意味がなくなります。つまり活性化関数の役割は、ネットワークに非線形性を持ち込むことです。シグモイド関数は出力を0から1のあいだに押し込むS字型の関数で、確率として読めるため二値分類の出力層に使われます。tanh関数は出力が-1から1で、原点について対称なぶんシグモイドより扱いやすい面があります。ReLU関数は入力が正ならそのまま、負なら0を返す単純な関数です。Leaky ReLU関数は、負の側にもわずかな傾きを持たせてReLU関数の弱点をやわらげたものです。
活性化関数の選び方は、勾配消失問題と直結しています。シグモイド関数を微分すると、いちばん大きいところでも0.25にしかなりません。層をさかのぼるたびに0.25以下の数がかけ合わされていくので、何層もさかのぼると勾配はほとんど0になり、入力に近い層の重みが動かなくなります。tanh関数は微分の最大値が1なのでいくらかましですが、根本の解決にはなりません。ReLU関数は正の領域で微分が常に1なので、いくらかけ合わせても値が小さくなりません。これがReLU関数が深いネットワークで広く使われる理由です。ただしReLU関数は負の領域では微分が0なので、いったん負側に入ったユニットが二度と学習しなくなることがあり、Leaky ReLU関数はここへの対処にあたります。なおシラバスでは、勾配消失問題は12の活性化関数、15の誤差逆伝播法、22の回帰結合層の3か所に登場します。
出力層だけは、解こうとしている問題に合わせて選びます。二値分類ならシグモイド関数、クラスが3つ以上ある多クラス分類ならソフトマックス関数です。ソフトマックス関数は出力の総和がちょうど1になるように正規化するので、各クラスの確率として読めます。隠れ層の活性化関数として使うものではありません。誤差関数は、モデルの出力と正解のずれをひとつの数値にする関数です。回帰なら平均二乗誤差関数、分類なら交差エントロピーを使うのが基本で、多クラス分類ではソフトマックス関数と交差エントロピーがセットになります。シラバスの13番にはこのほか、2つの確率分布のへだたりを測るカルバック・ライブラー情報量(KL)、2つのデータが同じものかどうかを距離で学ばせるContrastive Loss、基準と正例と負例の3つ組で距離の関係を学ばせるTriplet Lossが挙げられています。
誤差関数の値を小さくするには、それぞれの重みを少し動かしたときに誤差がどれだけ変わるか、つまり勾配を知る必要があります。これを出力側から入力側へさかのぼりながら効率よく計算していく手法が誤差逆伝播法です。土台になっているのは連鎖律で、合成関数の微分を部品ごとの微分のかけ算に分解できるという規則です。ここで大事なのは、誤差逆伝播法は勾配を求めるための計算法であって、重みを実際に更新するのは勾配降下法だという点です。誤差逆伝播法が重みを更新すると言い切ってしまうと不正確になります。また、最終的な誤差に対してどの層のどのユニットがどれだけ責任を負うのかを割り当てる問題を信用割当問題といい、誤差逆伝播法はこれに実用的な答えを与えたと位置づけられています。
誤差逆伝播法を深いネットワークに適用すると、勾配消失問題とは逆に、さかのぼるほど勾配が大きくなりすぎて発散する勾配爆発問題も起こります。1より小さい数をかけ続ければ0に近づき、1より大きい数をかけ続ければ際限なく大きくなる、という同じ計算の裏表です。勾配爆発が起きると重みが一気に飛んで学習が壊れます。シラバスでは、勾配爆発問題は15の誤差逆伝播法と22の回帰結合層の両方に置かれていて、とくに時間の方向へ長くさかのぼる回帰結合層で問題になります。
| 活性化関数 | 出力の範囲 | 主な使いどころ | 注意点 |
|---|---|---|---|
| シグモイド関数 | 0 から 1 | 二値分類の出力層 | 微分の最大値が0.25で勾配消失を起こしやすい |
| tanh関数 | -1 から 1 | 隠れ層 | 微分の最大値は1だが、端では0に近づく |
| ReLU関数 | 0 以上 | 隠れ層 | 負の入力では勾配が0になり学習が止まることがある |
| Leaky ReLU関数 | 実数全体 | 隠れ層 | 負側の傾きをどれくらいにするかを決める必要がある |
| ソフトマックス関数 | 0 から 1 で総和が1 | 多クラス分類の出力層 | 隠れ層の活性化関数としては使わない |
- 単純パーセプトロン
- 入力層と出力層だけからなる最も単純なニューラルネットワーク。線形分離可能な問題しか解けず、XORは表現できない。
- 多層パーセプトロン
- 入力層と出力層のあいだに隠れ層を持つニューラルネットワーク。境界を折り曲げられるので非線形な分離ができる。
- 隠れ層
- 入力層と出力層のあいだにある層。外から直接値を与えたり読み取ったりしない中間の表現を担う。
- GPU
- 小さな演算コアを大量に持ち、同じ計算を一斉に並列処理する装置。ディープラーニングの行列演算と相性がよい。
- TPU
- ディープラーニングのテンソル演算に的をしぼって設計された演算装置。用途を限る代わりに効率を高めている。
- シグモイド関数
- 出力を0から1に押し込むS字型の活性化関数。二値分類の出力層に使う。微分の最大値が0.25で勾配消失の原因になる。
- tanh関数
- 出力が-1から1の活性化関数。微分の最大値は1で、シグモイド関数よりは勾配が減りにくい。
- ReLU関数
- 入力が正ならそのまま、負なら0を返す活性化関数。正の領域で微分が常に1なので勾配消失を大きく緩和する。
- Leaky ReLU関数
- ReLU関数の負の側にもわずかな傾きを持たせた活性化関数。負側で勾配が0になって学習が止まる問題への対処。
- ソフトマックス関数
- 出力の総和が1になるように正規化する活性化関数。多クラス分類の出力層に使い、交差エントロピーと組み合わせる。
- 勾配消失問題
- 逆伝播の途中で勾配が0に近づき、入力に近い層が学習されなくなる問題。活性化関数の微分が小さいことが典型的な原因。
- 勾配爆発問題
- 逆伝播の途中で勾配が大きくなりすぎて発散し、重みが飛んで学習が壊れる問題。回帰結合層でとくに起きやすい。
- 交差エントロピー
- 分類問題で使われる代表的な誤差関数。予測した確率分布と正解の分布のずれを測る。
- 平均二乗誤差関数
- 回帰問題で使われる代表的な誤差関数。予測と正解の差を二乗して平均する。
- カルバック・ライブラー情報量(KL)
- 2つの確率分布のへだたりを測る量。誤差関数として使われることがある。
- Contrastive Loss
- 2つのデータの組について、同じものなら近く、違うものなら遠くなるように距離を学ばせる誤差関数。
- Triplet Loss
- 基準・正例・負例の3つ組を使い、基準と正例の距離が基準と負例の距離より小さくなるように学ばせる誤差関数。
- 連鎖律
- 合成関数の微分を、部品ごとの微分のかけ算に分解できるという規則。誤差逆伝播法の数学的な土台。
- 信用割当問題
- 最終的な誤差に対して、どの層のどのユニットがどれだけ責任を負うのかを割り当てる問題。
例題 10層のネットワークの活性化関数を、すべて入力をそのまま返す関数に置き換えたら、このネットワークは何と同じものになるか。
入力層から出力層まで1回の線形変換をするだけのネットワークと同じになる。線形変換をいくつ重ねても、まとめればひとつの線形変換で書ける。つまり層を10に増やしたことがまったく無駄になり、直線でしか分けられないモデルに戻ってしまう。活性化関数は「気分で挟むもの」ではなく、層を重ねることに意味を持たせるための必須の部品である。この理屈が分かっていると、単純パーセプトロンが線形分離しかできない理由と、多層にしただけでは足りず非線形な活性化関数が要る理由が、同じ話としてつながる。
例題 隠れ層の活性化関数をシグモイド関数からtanh関数に替えたら学習が進むようになった。ところが層をさらに深くすると、また入力側の層が動かなくなった。何が起きているのか。
どちらの関数も、微分の値が場所によっては1をかなり下回る。tanh関数のほうが微分の最大値は大きいので浅いうちは改善するが、逆伝播では層の数だけ微分がかけ合わされるため、1未満の数を何十回もかければやはり勾配は消えていく。tanh関数は勾配消失問題をやわらげはしても、なくしてはいない。次の一手はReLU関数である。正の領域で微分が常に1なので、何度かけ合わせても値が縮まない。ただし負の領域では勾配が0になってユニットが止まることがあるので、そこが気になるならLeaky ReLU関数を検討する。深さの問題は活性化関数だけで片づくとは限らず、スキップ結合や正規化層といった構造の側の工夫と併せて考えることになる。
出典:一般社団法人日本ディープラーニング協会「G検定 試験出題範囲(シラバス 2024)」第1.4版(2026年5月11日) 技術分野 ディープラーニングの概要 11. ニューラルネットワークとディープラーニング
正則化と最適化手法
過学習を抑える正則化と、誤差の谷をうまく下っていくための最適化手法を、シラバス14番と16番に沿って整理します。
訓練データにだけ合いすぎて、初めて見るデータでの成績が落ちてしまう状態を過学習といいます。正則化は、この過学習を抑えるためにモデルの自由さをわざと制限する工夫の総称です。代表的なのは、誤差関数に重みの大きさに応じたペナルティを足し込む方法です。ペナルティが加わると、誤差を小さくしたいという力と重みを大きくしたくないという力がつり合うところで学習が落ち着くので、極端に大きな重みを使って訓練データを丸暗記することができなくなります。シラバスの14番には、L0正則化・L1正則化・L2正則化・正則化・ドロップアウト・ラッソ回帰・リッジ回帰の7つが並んでいます。
L0正則化は、値が0でない重みの個数そのものをペナルティにします。考え方は素直ですが、個数は微分できないので、勾配を使う学習にそのまま組み込むのは難しい手法です。L1正則化は重みの絶対値の和をペナルティにします。この形だと重みがちょうど0の点まで押し込まれやすく、使われない特徴が自動的に落ちるので、特徴選択の効果があります。値の多くが0である状態をスパースといいます。L2正則化は重みの二乗和をペナルティにします。全体の重みを小さくそろえる働きはありますが、0に近づけはしてもぴったり0にはなりにくいのが特徴です。線形回帰にL1正則化を組み合わせたものをラッソ回帰、L2正則化を組み合わせたものをリッジ回帰と呼びます。L1とラッソ、L2とリッジの対応は取り違えやすいので、必ずセットで覚えてください。
ドロップアウトは、学習のたびに隠れ層のユニットを一定の割合でランダムに無効にしてしまう手法です。毎回すこしずつ違う形のネットワークで学習することになるので、特定のユニットの組み合わせに頼りきった覚え方ができなくなり、結果として多数のモデルを平均したような効果が生まれます。無効にするのは学習のときだけで、推論のときはすべてのユニットを使います。ここで注意したいのが分類の位置です。名前が似ているので正規化層の仲間だと思われがちですが、シラバスではドロップアウトは14番の正則化に置かれています。19番の正規化層に並ぶのはバッチ正規化・レイヤー正規化・インスタンス正規化・グループ正規化の4つで、ドロップアウトは入っていません。
重みをどう動かすかを決めるのが最適化手法です。基本になるのは勾配降下法で、誤差関数の勾配を求め、その逆の方向へ重みを少しずつ動かします。この少しずつの幅を決めるのが学習率です。学習率が大きすぎると谷を飛び越えて発散し、小さすぎるといつまでも底にたどりつきません。1回の更新にどれだけのデータを使うかで呼び方が変わります。全データをまとめて使うのがバッチ学習、1件ずつ使うのがオンライン学習、その中間で数十から数百件のかたまりを使うのがミニバッチ学習です。実務ではミニバッチ学習がほとんどを占めます。データを1周することをエポック、重みを1回更新することをイテレーションと呼びます。1200件のデータをミニバッチのサイズ60で回すなら、1エポックは20イテレーションです。
勾配降下法が止まってしまう場所はひとつではありません。全体で最も誤差が小さい点を大域最適解、その付近でだけ最も小さい点を局所最適解といいます。さらに、ある方向から見れば谷底なのに別の方向から見れば山頂になっている点があり、これを鞍点といいます。パラメータの数が非常に多いディープラーニングでは、あらゆる方向で同時に谷底になる局所最適解よりも、鞍点にはまって動けなくなるほうが起こりやすいと考えられています。確率的勾配降下法(SGD)は一部のデータだけで勾配を求めるためにばらつきが乗り、そのゆらぎのおかげで鞍点や浅い局所最適解から抜け出しやすいという利点があります。
SGDの弱点を補う工夫は、大きく2つの系統に分かれます。ひとつはモーメンタムで、前回の更新量を慣性として足し込み、行きつ戻りつする振動を抑えて谷に沿ってすべり下りるようにします。もうひとつは学習率をパラメータごとに自動で調整する系統です。AdaGradは、それまでの更新が大きかったパラメータほど学習率を下げますが、下げ続けるので後半に動かなくなるという弱点があります。RMSpropは過去の勾配を指数移動平均で見ることで、この下がりすぎを緩めました。Adamはこの2系統、つまり慣性の考え方と学習率の適応を組み合わせたもので、実務の既定値としてよく使われます。シラバスにはこのほかAdaDelta・AdaBound・AMSBoundも挙がっています。
学習率やミニバッチのサイズ、層の数のように、学習で決まるのではなく人が事前に決める値をハイパーパラメータといいます。良い値を探す代表的な方法は2つあります。グリッドサーチは候補の値を格子状に並べてすべての組み合わせを試す方法で、網羅的ですが組み合わせの数が急激に増えます。ランダムサーチは範囲の中からランダムに点を選んで試す方法で、効いていないハイパーパラメータに試行を浪費しにくいという利点があります。学習を打ち切る時期の決め方もひとつの工夫で、検証データの誤差が悪化に転じたところで止めるやり方を早期終了といいます。なお、あらゆる問題で他より優れた万能のアルゴリズムは存在しないという主張をノーフリーランチの定理といい、手法選びは問題ごとに考えるほかないことを示しています。
モデルを大きくするほど過学習して悪くなるという直感に反する現象も知られています。二重降下現象といい、モデルの大きさや学習の量を増やしていくと検証誤差はいったん悪化し、さらに増やすと再び下がりはじめます。誤差の曲線が2回下がるのでこの名前がつきました。大きなモデルほど良い結果が出ることがある、という近年の経験を説明する枠組みのひとつとして、シラバス16番に収録されています。
| 手法 | 工夫のしかた | 位置づけ |
|---|---|---|
| 確率的勾配降下法(SGD) | 一部のデータだけで勾配を求めて更新する | 最も基本的な更新のしかた |
| モーメンタム | 前回の更新量を慣性として足し込む | 振動を抑えて収束を速める系統 |
| AdaGrad | 更新が大きかったパラメータほど学習率を下げる | 学習率を適応させる系統の出発点 |
| RMSprop | 過去の勾配を指数移動平均で見て減衰をゆるめる | AdaGradの学習率が下がりすぎる点への対処 |
| Adam | 慣性と学習率の適応を組み合わせる | AdaDelta・AdaBound・AMSBoundと並ぶ発展形 |
- 正則化
- モデルの自由さをわざと制限して過学習を抑える工夫の総称。誤差関数にペナルティを加える方法が代表的。
- L0正則化
- 値が0でない重みの個数そのものをペナルティにする正則化。微分できないので勾配を使う学習には組み込みにくい。
- L1正則化
- 重みの絶対値の和をペナルティにする正則化。重みがちょうど0になりやすく、特徴選択の効果がある。
- L2正則化
- 重みの二乗和をペナルティにする正則化。重みを小さくそろえるが、ぴったり0にはなりにくい。
- ラッソ回帰
- 線形回帰にL1正則化を組み合わせた手法。不要な特徴の係数が0になり、スパースな解が得られる。
- リッジ回帰
- 線形回帰にL2正則化を組み合わせた手法。係数全体を小さく抑えて過学習を防ぐ。
- ドロップアウト
- 学習時にユニットをランダムに無効化して過学習を抑える手法。シラバスでは正規化層ではなく14番の正則化に分類される。
- 勾配降下法
- 誤差関数の勾配の逆方向へパラメータを少しずつ動かして誤差を小さくしていく最適化の基本手法。
- 学習率
- 1回の更新でパラメータをどれだけ動かすかを決めるハイパーパラメータ。大きすぎると発散し、小さすぎると進まない。
- バッチ学習
- 全データを使って勾配を求め、1回だけ更新する学習の進め方。1回の更新は安定するが計算が重い。
- オンライン学習
- データを1件使うたびにパラメータを更新する学習の進め方。更新は軽いが1回ごとのばらつきが大きい。
- ミニバッチ学習
- 数十から数百件のかたまりごとにパラメータを更新する学習の進め方。実務で最も広く使われる。
- エポック
- 訓練データ全体を1周すること。何周させるかは代表的なハイパーパラメータのひとつ。
- イテレーション
- パラメータを1回更新すること。1エポックあたりのイテレーション数は、データ件数をミニバッチのサイズで割った値になる。
- 鞍点
- ある方向から見れば極小、別の方向から見れば極大になっている点。高次元では学習が停滞する主な原因とされる。
- 局所最適解
- その近くの範囲では最も誤差が小さいが、全体で見ればもっと良い点が別にある解。
- 大域最適解
- 取りうる範囲全体の中で誤差が最も小さい解。
- モーメンタム
- 前回の更新量を慣性として加え、振動を抑えて収束を速める工夫。
- AdaGrad
- 更新が大きかったパラメータほど学習率を下げる適応的な手法。学習率が下がり続けて止まりやすい弱点がある。
- RMSprop
- 過去の勾配を指数移動平均で見ることで、AdaGradの学習率が下がりすぎる弱点を緩めた手法。
- Adam
- 慣性の考え方と学習率の適応を組み合わせた最適化手法。実務の既定値としてよく使われる。
- ハイパーパラメータ
- 学習で決まるのではなく、人が事前に決める設定値。学習率、ミニバッチのサイズ、層の数などが該当する。
- グリッドサーチ
- 候補の値を格子状に並べ、すべての組み合わせを試すハイパーパラメータの探索方法。
- ランダムサーチ
- 探索範囲からランダムに点を選んで試すハイパーパラメータの探索方法。効かない項目に試行を浪費しにくい。
- 早期終了
- 検証データの誤差が悪化に転じた時点で学習を打ち切ること。過学習が進む前に止める工夫。
- ノーフリーランチの定理
- あらゆる問題で他より優れた万能のアルゴリズムは存在しないという主張。
- 二重降下現象
- モデルの大きさや学習量を増やしていくと、検証誤差がいったん悪化してから再び下がる現象。
例題 訓練データ4800件を、ミニバッチのサイズ80で5エポック学習させた。重みは何回更新されるか。
1エポックあたりのイテレーション数は 4800 わる 80 で60回、これを5エポック行うので合計300回になる。エポックはデータを何周したか、イテレーションは重みを何回更新したかを数える単位で、両者はミニバッチのサイズを介して結びついている。ミニバッチのサイズを大きくすると1エポックあたりの更新回数が減り、1回の勾配は安定するが更新の回数が足りなくなることがある。逆に小さくすると更新は増えるが1回ごとのばらつきが大きくなる。この綱引きがミニバッチのサイズというハイパーパラメータの中身である。
例題 訓練データでの誤差はどんどん下がるのに、検証データでの誤差が途中から上がりはじめた。どの引き出しを開けるべきか。
過学習が起きているので、正則化の引き出しを開ける。誤差関数にペナルティを足すならL1正則化かL2正則化で、不要な特徴を落として説明しやすいモデルにしたいならL1正則化、全体をなだらかに抑えたいならL2正則化を選ぶ。ニューラルネットワークならドロップアウトも使える。学習の進め方の側では、検証誤差が悪化に転じたところで打ち切る早期終了が単純で効く。なお学習率を上げても過学習は直らない。学習率は谷をどれくらいの歩幅で下るかの設定であって、モデルの自由さを制限する仕組みではないからである。
出典:一般社団法人日本ディープラーニング協会「G検定 試験出題範囲(シラバス 2024)」第1.4版(2026年5月11日) 技術分野 ディープラーニングの概要 16. 最適化手法
ディープラーニングの要素技術
畳み込み層から正規化層、回帰結合層、Attentionまで、深いモデルを組み立てる部品を順に見ていきます。
全結合層は、前の層のすべてのユニットと次の層のすべてのユニットを重みでつなぐ、いちばん素朴な層です。表現力は高いのですが、つなぎ方が総当たりなので重みの数が入力の大きさと出力の大きさのかけ算で増えていきます。画像のように入力の要素数が数万を超えるデータに全結合層をそのまま当てると、パラメータが膨れ上がって学習できません。畳み込み層は、小さなフィルタを画像の上で滑らせながら同じ重みを使い回すことでこの問題を解きます。つながるのは近くの画素だけ、しかも重みは場所を変えても同じものを使う。この2つの性質のおかげで、パラメータの数を大幅に減らしながら、画像のどこに写っていても同じ特徴を拾えるようになります。
畳み込みの部品には名前が付いています。フィルタあるいはカーネルは、滑らせる小さな重みの並びです。ストライドは、そのフィルタを1回に何画素ずつずらすかという移動の幅で、大きくすると出力が粗くなり計算も軽くなります。パディングは、入力の周囲をあらかじめ値で埋めておく処理で、これをしないと畳み込みのたびに出力が小さくなり、端の画素が中央の画素より参照される回数が少なくなってしまいます。フィルタを1枚通した結果として得られる出力が特徴マップです。シラバスにはこのほか、フィルタの要素のあいだをすかして受け取る範囲を広げるDilated ConvolutionとAtrous Convolution、空間方向とチャネル方向の畳み込みを分けて計算量を減らすDepthwise Separable Convolutionが挙げられています。
正規化層は、中間層の出力の分布をそろえて学習を安定させ、速くするための層です。バッチ正規化は、ミニバッチの中で同じチャネルの値をまとめて平均0・分散1に整えます。ミニバッチのサイズが小さいと統計量が当てにならなくなるのが弱点です。レイヤー正規化は、1つのサンプルの中で層全体の値をまとめて整えるのでミニバッチのサイズに左右されず、系列を扱うモデルでよく使われます。インスタンス正規化はサンプルごと・チャネルごとに整えるもので画像の様式変換などで使われ、グループ正規化はチャネルをいくつかの組に分けて組ごとに整えます。シラバスでは19番の名前がv1.1で正則化層から正規化層に変わっています。似た名前のドロップアウトは、ここではなく14番の正則化に置かれている点に注意してください。
プーリング層は、決まった大きさの領域をひとつの代表値に縮約する層です。領域の最大値をとるのが最大値プーリング、平均をとるのが平均値プーリングです。縮約すると解像度が下がって計算が軽くなりますが、それ以上に大事なのが不変性の獲得です。被写体が数画素ずれても代表値はあまり変わらないので、位置のわずかなずれに強いモデルになります。グローバルアベレージプーリング(GAP)は、特徴マップ1枚をまるごと平均して1つの値に潰すもので、最後に全結合層を積む代わりに使うとパラメータを大きく減らせます。プーリング層には学習する重みがない点も、畳み込み層との違いとして押さえておくとよいでしょう。
層を深く積むほど表現力は上がるはずなのに、実際にはある深さを超えると学習がうまく進まなくなります。スキップ結合は、いくつかの層を飛び越して入力をそのまま先の層の出力に足し込む配線で、この行き詰まりを解きました。勾配が浅い経路をたどって入力側まで届くようになるため、100層を超えるネットワークでも学習できます。この考え方を採り入れた代表的なモデルがResNetです。シラバスでは21番のキーワードがResNetだけで、26番の画像認識にも再び登場します。
回帰結合層は、前の時刻の状態を自分の入力に戻す配線を持つ層で、これを備えたネットワークをリカレントニューラルネットワーク(RNN)といいます。文章や音声、株価のような時系列データを、順番を保ったまま扱えるのが特長です。戻す先の違いで名前が分かれ、隠れ層の出力を次の時刻の隠れ層に戻すのがエルマンネットワーク、出力層の出力を次の時刻の隠れ層に戻すのがジョルダンネットワークです。学習は時間方向にネットワークを展開してから誤差逆伝播法を適用するBPTTで行いますが、長い系列では時間の方向に何度もさかのぼるため勾配消失問題と勾配爆発問題が強く出ます。系列を先頭からと末尾からの両方向で読むのが双方向RNN、学習時に前ステップの予測ではなく正解を次の入力として与えるのが教師強制です。
この勾配の問題に、ゲート機構という答えを出したのがLSTMです。LSTMは情報をためておくCECという記憶の経路を持ち、そこへ何を書き込むかを決める入力ゲート、何を捨てるかを決める忘却ゲート、何を外へ出すかを決める出力ゲートの3つのゲートで出し入れを制御します。GRUはLSTMを簡略化したもので、ゲートはリセットゲートと更新ゲートの2つだけです。パラメータが少なく計算が軽い一方、常にLSTMより高性能というわけではありません。ゲートの数が3と2であること、CECはLSTM側の用語であることが、繰り返し問われる区別です。
Attentionは、入力のどこに注目すべきかを重みとして計算する仕組みです。クエリ・キー・バリューの3つで表現し、クエリとキーの相性から重みを決めて、その重みでバリューを混ぜ合わせます。同じ系列の中で各要素どうしの関係を計算するのがSelf-Attention、翻訳のように別々の2つの系列のあいだで計算するのがSource-Target Attentionです。複数の注目のしかたを並列に走らせて結果をまとめるのがMulti-Head Attentionです。この仕組みだけでネットワークを組み上げたのがTransformerで、回帰結合を使わないので系列全体を並列に計算でき、離れた語どうしの関係も直接つかめます。ただし並列に処理すると語の順番の情報が失われるので、各位置に固有の信号を足す位置エンコーディングで語順を与えます。TransformerはRNNの一種ではない、という点が引っかけどころです。
オートエンコーダは、入力をいったん低い次元に圧縮し、そこから元の入力を復元するように学習するネットワークです。出力に入力と同じものを置くので、正解ラベルを用意しなくても学習でき、次元削減や特徴の抽出に使えます。層を重ねたものが積層オートエンコーダで、これを1層ずつ学習させて深いネットワークの初期値を作るやり方が事前学習です。変分オートエンコーダ(VAE)は、圧縮した先を1点ではなく確率分布として学ぶ点が違い、その分布から取り出した値を復元することで新しいデータを生成できます。シラバスにはVQ-VAE・info VAE・β-VAEも挙げられています。
データ拡張は、手元のデータに変換を加えて水増しし、過学習を抑えて汎化性能を上げる工夫です。画像では、左右を反転するRandom Flip、回転させるRotate、一部を切り出すCrop、明るさを変えるBrightness、コントラストを変えるContrast、一部を四角く塗りつぶすCutoutやRandom Erasing、2枚の画像を重ね合わせるMixup、2枚の一部を貼り合わせるCutMix、どの変換をどれだけかけるかを自動で決めるRandAugumentが挙げられています。テキストでは言い換えを作るparaphrasing、ノイズを混ぜるnoisingがあります。ここで気をつけたいのは、意味を壊す変換を選ばないことです。手書き数字を上下反転すれば、それはもうその数字ではありません。
| 層の種類 | 何をするか | シラバスのキーワード |
|---|---|---|
| 全結合層 | 前の層のすべてのユニットと重みでつなぐ | 重み, 線形関数 |
| 畳み込み層 | フィルタを滑らせて局所的な特徴を取り出す | カーネル, ストライド, パディング, 特徴マップ, CNN |
| 正規化層 | 中間層の出力の分布をそろえて学習を安定させる | バッチ正規化, レイヤー正規化, インスタンス正規化, グループ正規化 |
| プーリング層 | 領域を代表値に縮約して位置ずれに強くする | 最大値プーリング, 平均値プーリング, GAP, 不変性の獲得 |
| 回帰結合層 | 前の時刻の状態を戻して系列を扱う | RNN, LSTM, GRU, BPTT, 教師強制, 双方向RNN |
- 全結合層
- 前の層のすべてのユニットと次の層のすべてのユニットを重みでつなぐ層。重みの数が多くなりやすい。
- 畳み込み層
- 小さなフィルタを滑らせながら同じ重みを使い回して局所的な特徴を取り出す層。パラメータが少なく済む。
- ストライド
- フィルタを1回に何画素ずつずらすかという移動の幅。大きくすると出力が粗くなり計算が軽くなる。
- パディング
- 入力の周囲をあらかじめ値で埋めておく処理。出力サイズの縮小を抑え、端の情報が失われにくくなる。
- 特徴マップ
- フィルタを1枚通した結果として得られる出力。どこにその特徴があったかを示す。
- バッチ正規化
- ミニバッチの中で同じチャネルの値をまとめて平均0・分散1に整える正規化。ミニバッチが小さいと不安定になる。
- レイヤー正規化
- 1つのサンプルの中で層全体の値をまとめて整える正規化。ミニバッチのサイズに左右されない。
- 最大値プーリング
- 領域の中の最大値を代表値としてとるプーリング。位置のわずかなずれに強くなる。
- グローバルアベレージプーリング(GAP)
- 特徴マップ1枚をまるごと平均して1つの値に潰す操作。全結合層の代わりに使うとパラメータを減らせる。
- 不変性の獲得
- 被写体の位置が多少ずれても出力が変わりにくくなること。プーリング層の重要な役割。
- スキップ結合
- いくつかの層を飛び越して入力を先の層の出力に足し込む配線。勾配が浅い経路を通れるので深いモデルでも学習できる。
- ResNet
- スキップ結合を採り入れ、100層を超える深さの学習を可能にした画像認識モデル。
- エルマンネットワーク
- 隠れ層の出力を次の時刻の隠れ層に戻す形のリカレントニューラルネットワーク。
- ジョルダンネットワーク
- 出力層の出力を次の時刻の隠れ層に戻す形のリカレントニューラルネットワーク。
- BPTT
- 時間方向にネットワークを展開してから誤差逆伝播法を適用する、RNNの学習方法。
- 教師強制
- 系列を生成する学習で、前ステップの予測ではなく正解を次の入力として与えるやり方。
- LSTM
- CECという記憶の経路と、入力・忘却・出力の3つのゲートを持つ回帰結合層。長い依存関係を保持できる。
- GRU
- LSTMを簡略化し、リセットゲートと更新ゲートの2つだけにした回帰結合層。パラメータが少なく計算が軽い。
- Self-Attention
- 同じ系列の中で各要素どうしの関係を計算するAttention。Transformerの中心的な部品。
- Source-Target Attention
- 別々の2つの系列のあいだで注目の重みを計算するAttention。翻訳のような入力と出力が分かれるタスクで使う。
- Transformer
- 回帰結合を使わずAttentionを中心に構成した系列モデル。並列に計算でき、位置エンコーディングで語順を与える。
- 位置エンコーディング
- 系列の各位置に固有の信号を足して語順の情報を与える仕組み。Transformerで必要になる。
- オートエンコーダ
- 入力を低い次元に圧縮してから元の入力を復元するように学習するネットワーク。次元削減や事前学習に使う。
- 変分オートエンコーダ(VAE)
- 圧縮した先を1点ではなく確率分布として学ぶオートエンコーダ。分布から取り出した値を復元して新しいデータを作れる。
- データ拡張
- 手元のデータに変換を加えて水増しし、過学習を抑えて汎化性能を上げる工夫。Mixup・CutMix・Cutoutなどがある。
例題 手書き数字の分類器を作っている。学習データが少ないのでデータ拡張をしたい。左右反転と上下反転を入れてよいか。
どちらも入れてはいけない。手書き数字を左右に反転すれば2は2に見えなくなり、上下に反転すれば6と9の関係が壊れる。正解ラベルはそのままなのに中身だけが別のものになるので、モデルには矛盾した例を教えることになる。データ拡張で使ってよいのは、人が見てもラベルが変わらない範囲の変換に限られる。手書き数字なら、わずかな回転、平行移動、線の太さや明るさの変化あたりが安全である。逆に、自然物の写真の分類のように左右の向きに意味がない対象であれば、左右反転は有効な水増しになる。どの変換が使えるかはタスクとデータで決まる、というのがこの中項目の目標にあたる。
例題 リカレントニューラルネットワークで長い文章を読ませたところ、文の後半にいくほど前半に書かれていた内容が効かなくなった。何が起きていて、どの部品で対処するか。
時間の方向にさかのぼる学習で勾配が縮んでいる。BPTTでは系列の長さだけ誤差を過去へ運ぶので、100語前まで届くころには勾配がほとんど残らず、遠い過去との結びつきが学習されない。逆に勾配が発散してしまうこともあり、これが勾配爆発問題である。対処はゲート機構を持つ層に替えることで、LSTMは情報をためておくCECという経路を持ち、何を書き込み何を捨て何を出すかをゲートで制御するので、遠い過去の情報を必要なあいだ保てる。GRUはこれを簡略化した軽い選択肢である。文全体を一度に見てよいのであれば、そもそも回帰結合を使わずAttentionで組む道もある。
出典:一般社団法人日本ディープラーニング協会「G検定 試験出題範囲(シラバス 2024)」第1.4版(2026年5月11日) 技術分野 ディープラーニングの要素技術 23. Attention
ディープラーニングの応用例
画像・言語・音声・強化学習・生成から、転移学習・マルチモーダル・解釈性・軽量化までを、代表モデルの名前とともに押さえます。
画像認識といっても、何を出力するかでタスクは分かれます。画像1枚に何が写っているかのクラスを答えるのが物体識別、あらかじめ決めた種類に限らず一般的な物体を認識することを一般物体認識といいます。物体を四角い枠で囲んで位置とクラスを答えるのが物体検出、画素ひとつひとつにクラスを割り当てるのがセマンティックセグメンテーションです。セマンティックセグメンテーションでは同じクラスの物体が2つ並んでいても区別されませんが、個体まで分けるのがインスタンスセグメンテーションです。この2つを合わせて、数えられる物体は個体ごとに、空や道路のように数えられない領域はクラスごとに塗り分けるのがパノプティックセグメンテーションです。人体の関節点の位置を求めるのが姿勢推定で、Open Poseが代表例です。
画像認識モデルの流れも押さえておきましょう。AlexNetは2012年のILSVRCで優勝し、ReLU関数・ドロップアウト・GPUによる学習を組み合わせて従来手法に大差をつけました。2014年のILSVRCではVGGとGoogLeNetが上位に入り、VGGは3かける3の小さな畳み込みだけを積み重ねる単純で深い構成、GoogLeNetは大きさの違うフィルタを並列に当てるInceptionモジュールでパラメータを抑えたまま深くする構成をとりました。2015年にはスキップ結合を使ったResNetが登場し、100層を超える深さが現実になります。以降はResNetの幅を広げたWide ResNet、すべての層をつなぐDenseNet、チャネルの重要度を学習するSENet、深さ・幅・解像度の釣り合いを取ったEfficientNet、携帯端末向けに軽くしたMobileNetやMnasNet、そして構造そのものを探索させるNASへと広がりました。畳み込みを使わずTransformerの考え方を画像に持ち込んだのがVision Transformerです。
物体検出のモデルは、処理の段数で2つに分かれます。YOLOとSSDは、候補領域の抽出とクラスの判定をまとめて1回の推論で行う1段階の方式で、速さが持ち味です。R-CNNから始まりFast R-CNN、Faster R-CNNと発展した系統は、まず候補領域を出してから分類するという2段階の方式で、遅い代わりに精度が出やすい傾向があります。Mask R-CNNはFaster R-CNNに画素単位の予測を足したもので、インスタンスセグメンテーションまで行えます。セグメンテーション側の代表はFCN、SegNet、U-Net、PSPNet、DeepLabで、U-Netはエンコーダとデコーダをスキップ結合でつないだU字の構造を持ち、医用画像でよく使われます。U-Netは物体検出のモデルではない、という点を取り違えないでください。異なる解像度の特徴を組み合わせるFPNも収録語です。
自然言語処理は、文を単語に切り分ける形態素解析、語のかかり受けを調べる構文解析といった下ごしらえから始まります。単語をどうベクトルにするかが次の課題で、いちばん素朴なのが1語に1つの次元を割り当てるワンホットベクトルですが、次元が語彙の大きさになるうえ、どの語とどの語が似ているかという情報を持ちません。文書を語の出現回数の集まりとして扱うBoW、語の重要度を文書内の頻度と文書をまたいだ珍しさから測るTF-IDF、連続するn個の語の並びを単位とするn-gramも古典的な扱い方です。これらに対して、語を密なベクトルで表す分散表現を学習するのがword2vecで、周辺の語から中心の語を当てるCBOWと、中心の語から周辺の語を当てるスキップグラムの2方式があります。向きが逆なので取り違えに注意してください。単語を部分文字列に分けて扱うfastText、文脈に応じてベクトルを変えるELMoと続きます。
系列を入力して系列を出力する枠組みがSeq2Seqで、機械翻訳や文書要約に使われます。ここにAttentionとTransformerが加わって性能が大きく伸びました。BERTはTransformerのエンコーダを使い、文の前後の両方向から文脈を見て事前学習する言語モデルです。双方向であることがBERTの特徴で、大量のテキストで事前学習してから各タスクに適応させるという使い方を広めました。PaLMや、より一般に大規模言語モデル(LLM)もシラバスの27番に置かれています。GLUEは言語理解の能力を複数のタスクでまとめて測るベンチマークです。応用のタスクとしては感情分析、機械翻訳、質問応答、情報検索、文書要約が挙がっています。
音声処理では、まずマイクで拾った空気の振動を数値の列に直します。標本化と量子化を行うA-D変換、その代表的な方式であるパルス符号変調器(PCM)がここに当たります。時間の波形を周波数の成分に分けるのが高速フーリエ変換(FFT)で、そこから声道の共鳴による山であるフォルマントやフォルマント周波数、周波数ごとの大まかな形であるスペクトル包絡を読み取ります。人の聞こえ方に合わせた尺度がメル尺度で、これを使って作る代表的な特徴量がメル周波数ケプストラム係数(MFCC)です。言語の音の単位が音素、それより広い音の単位が音韻です。古くは隠れマルコフモデルが音声認識の中心で、現在は音声の波形を直接生成するWaveNetや、入力と出力の長さがそろわない系列を学習させるCTCが使われます。話者識別や感情分析も音声処理のタスクです。
強化学習にディープラーニングを組み合わせたのが深層強化学習です。DQNは行動価値関数をニューラルネットワークで近似し、画面の画像だけからゲームを学習させました。過大評価を抑えるダブルDQN、状態の価値と行動の優位性を分けて扱うデュエリングネットワーク、探索のためのノイズを重みに入れるノイジーネットワーク、こうした改良をまとめたRainbowと発展します。複数の環境を並列に走らせるA3CやAPE-X、その延長のAgent57、方策を安定して更新するPPO、複数のエージェントが同時に学ぶマルチエージェント強化学習(MARL)、報酬の与え方を工夫する報酬成形も収録語です。実機での学習は危険で高くつくため、模擬環境で学んで実機へ移すsim2realや、模擬環境の見た目や物理をわざとばらつかせるドメインランダマイゼーションが使われます。人間のフィードバックから報酬モデルを作って言語モデルを調整するRLHFは、自然言語処理ではなくこの29番の深層強化学習に置かれています。
データ生成では、敵対的生成ネットワーク(GAN)がよく知られています。データを作り出す側のネットワークと、本物か作られたものかを見分ける側のネットワークを競わせながら学習させる仕組みで、畳み込みを使うDCGAN、対になっていない2群の画像を相互に変換するCycleGAN、線画から写真のように対応づけて変換するPix2Pixが派生しました。Diffusion Modelは考え方がまったく違い、画像に少しずつノイズを加えていく過程を逆にたどることで、ノイズから画像を作り出します。GANの一種ではありません。NeRFは複数の視点の写真から三次元の見え方を学び、任意の視点の画像を作ります。前の講義で扱った変分オートエンコーダ(VAE)も生成の手法のひとつで、GANとVAEとDiffusion Modelは並列に置かれる別々の系統だと整理してください。
大量のデータで事前学習した事前学習済みモデルを、手元の小さなタスクに使い回すのが転移学習とファインチューニングです。転移学習は、事前学習で得た特徴の抽出部分は固定したまま、主に出力層のあたりだけを新しいタスクで学習します。ファインチューニングは、重みの全体または広い範囲を新しいデータで学習し直します。ファインチューニングのほうが必要なデータも計算も多くなり、元のタスクで身についていた能力が失われる破滅的忘却が起こることがあります。少ない事例で適応させることをFew-shot、1例だけならOne-shotといい、事例を1つも与えないZero-shotは32番のマルチモーダルに置かれています。ラベルのないデータから疑似的な問題を作って学ぶ自己教師あり学習、少数のラベルと大量の未ラベルデータを併せて使う半教師あり学習も、この31番の収録語です。
画像と言語のように、種類の違う情報をまとめて扱うのがマルチモーダルです。CLIPは画像と説明文を同じベクトル空間に対応づけ、DALL-Eは文から画像を作ります。画像に説明文を付けるImage Captioning、画像について質問に答えるVisual Question Answering、文から画像を作るText-To-Image、複数の入出力形式をひとつのモデルで扱うUnified-IOやFlamingoも収録語です。ここで押さえておきたいのが基盤モデルの置き場所です。大量のデータで事前学習し、さまざまな下流のタスクに転用できる大規模なモデルを基盤モデルといいますが、シラバスではこの語が32番のマルチモーダルに置かれています。大規模言語モデル(LLM)は27番の自然言語処理、RLHFは29番の深層強化学習で、生成AIまわりの語は3か所に散っていることになります。
最後に、作ったモデルを実際に使うための2つの論点です。ひとつはモデルの解釈性で、なぜその判断になったのかを人が理解できる形で示す取り組みを説明可能AI(XAI)といいます。個々の予測の近くで単純なモデルを当てはめて説明するLIME、協力ゲーム理論の考え方で各特徴の寄与を配分するSHAP、特徴の値をわざと入れ替えて精度の落ち方を見るPermutation Importance、画像のどこを見て判断したかを熱の地図で示すCAMとGrad-CAMが挙げられています。もうひとつはモデルの軽量化です。大きな教師モデルの出力を小さなモデルに学ばせる蒸留、寄与の小さい結合や層を削るプルーニング、重みを表す数値の精度を落とす量子化があり、これらをまとめてモデル圧縮といいます。大きなネットワークの中には単独で学習させても同等の性能に届く部分ネットワークが含まれている、という宝くじ仮説はプルーニングの背景にある考え方です。軽量化が求められる典型が、端末側で推論を動かすエッジAIです。
| タスク | 何を出力するか | 代表的なモデル |
|---|---|---|
| 物体識別 | 画像1枚に写っている物体のクラス | AlexNet, VGG, GoogLeNet, ResNet |
| 物体検出 | 物体を囲む枠とそのクラス | YOLO, SSD, Faster R-CNN |
| セマンティックセグメンテーション | 画素ごとのクラス | FCN, SegNet, U-Net, PSPNet, DeepLab |
| インスタンスセグメンテーション | 画素ごとのクラスと個体の区別 | Mask R-CNN |
| 姿勢推定 | 人体の関節点の位置 | Open Pose |
- 物体検出
- 画像の中の物体を枠で囲み、位置とクラスを同時に答えるタスク。YOLO・SSD・R-CNN系が代表。
- セマンティックセグメンテーション
- 画素ひとつひとつにクラスを割り当てるタスク。同じクラスの個体どうしは区別しない。
- インスタンスセグメンテーション
- 画素ごとのクラスに加えて、同じクラスの物体を個体ごとに分けるタスク。Mask R-CNNが代表。
- AlexNet
- 2012年のILSVRCで優勝した画像認識モデル。ReLU関数・ドロップアウト・GPU学習を組み合わせた。
- VGG
- 3かける3の小さな畳み込みだけを積み重ねた、単純で深い構成の画像認識モデル。
- GoogLeNet
- 大きさの違うフィルタを並列に当てるInceptionモジュールを用い、パラメータを抑えたまま深くしたモデル。
- YOLO
- 候補領域の抽出とクラス判定を1回の推論でまとめて行う1段階の物体検出モデル。SSDも同じ系統。
- Faster R-CNN
- 候補領域を出してから分類する2段階の物体検出モデル。Mask R-CNNはこれに画素単位の予測を加えたもの。
- U-Net
- エンコーダとデコーダをスキップ結合でつないだU字構造のモデル。セマンティックセグメンテーションに用いる。
- ワンホットベクトル
- 1語に1つの次元を割り当てる素朴な単語表現。次元が語彙の大きさになり、語どうしの近さを表せない。
- 分散表現
- 単語を密なベクトルで表す表現。意味の近い語がベクトル空間で近くに配置される。
- CBOW
- word2vecの方式のひとつ。周辺の語から中心の語を当てるように学習する。
- スキップグラム
- word2vecの方式のひとつ。中心の語から周辺の語を当てるように学習する。
- TF-IDF
- 語の重要度を、文書内での出現頻度と文書をまたいだ珍しさから測る指標。
- BERT
- Transformerのエンコーダを用い、前後の両方向から文脈を見て事前学習する言語モデル。
- 大規模言語モデル(LLM)
- 大量のテキストで学習した非常に大きな言語モデル。シラバスでは27番の自然言語処理に置かれている。
- メル周波数ケプストラム係数(MFCC)
- 人の聞こえ方に合わせたメル尺度をもとに作る、音声処理の代表的な特徴量。
- DQN
- 行動価値関数をニューラルネットワークで近似する深層強化学習の代表手法。
- RLHF
- 人間のフィードバックから報酬モデルを作り、強化学習でモデルを調整する手法。シラバスでは29番の深層強化学習に置かれている。
- 敵対的生成ネットワーク(GAN)
- データを作る側と見分ける側のネットワークを競わせて学習させる生成モデル。DCGAN・CycleGAN・Pix2Pixが派生。
- Diffusion Model
- ノイズを段階的に加える過程を逆にたどってデータを生成するモデル。GANとは別の系統。
- 転移学習
- 事前学習済みモデルの特徴抽出部分を流用し、主に出力層のあたりを新しいタスクで学習する方法。
- ファインチューニング
- 事前学習済みモデルの重みの全体または広い範囲を、新しいデータで学習し直す方法。
- 破滅的忘却
- 新しいタスクを学習した結果、以前のタスクでの性能が大きく落ちてしまう現象。
- 基盤モデル
- 大量のデータで事前学習し、多様な下流タスクに転用できる大規模なモデル。シラバスでは32番のマルチモーダルに置かれている。
- 説明可能AI(XAI)
- モデルの判断根拠を人が理解できる形で示す取り組み。LIME・SHAP・CAM・Grad-CAMなどの手法がある。
- 蒸留
- 大きな教師モデルの出力を小さなモデルに学ばせる軽量化の手法。
- プルーニング
- 寄与の小さい結合や層を削ってモデルを小さくする軽量化の手法。
- 量子化
- 重みを表す数値の精度を落としてモデルを小さく速くする軽量化の手法。
- 宝くじ仮説
- 大きなネットワークの中に、単独で学習させても同等の性能に届く部分ネットワークが含まれているという仮説。
例題 工場の検査ラインで、傷のある部品を見つけたい。傷がどこにあるかを画素の単位で知りたい場合、どの種類のタスクとして設計すればよいか。
セマンティックセグメンテーションとして設計する。画素ごとに傷か地の面かのクラスを割り当てるので、傷の形と広がりがそのまま得られる。U-NetやFCN、SegNetがこの系統のモデルである。傷の個数を数えたい、あるいは1つ1つの傷を別々に管理したいのであれば、個体まで分けるインスタンスセグメンテーションを選ぶ。四角い枠だけで足りるなら物体検出、画像に傷があるかないかだけを判定すればよいなら物体識別で足りる。どこまでの粒度が業務に必要かで、選ぶタスクとモデルが決まる。粒度を上げるほど注釈を付ける手間も増えるので、必要のない細かさを求めないことも設計のうちである。
例題 学習済みの大きな画像認識モデルを、通信の届かない現場の端末に載せて動かしたい。どんな手を考えるか。
端末の側で推論を動かすので、エッジAIの文脈になる。まず考えるのはモデルの軽量化である。大きな教師モデルの出力を小さなモデルに学ばせる蒸留、寄与の小さい結合や層を削るプルーニング、重みを表す数値の精度を落とす量子化の3つが代表で、まとめてモデル圧縮という。組み合わせて使うこともできる。設計の段階から軽さを狙うなら、携帯端末向けに作られたMobileNetやMnasNet、深さと幅と解像度の釣り合いを取ったEfficientNetを土台に選ぶ手もある。どこまで小さくすると精度がどれだけ落ちるかは対象によって違うので、実際の現場のデータで測りながら決めることになる。
出典:一般社団法人日本ディープラーニング協会「G検定 試験出題範囲(シラバス 2024)」第1.4版(2026年5月11日) 技術分野 ディープラーニングの応用例 26. 画像認識
AIの社会実装と法律・倫理
AIプロジェクトの進め方とデータの扱い
AIを企画から運用まで運ぶ道筋を、CRISP-DM・PoC・MLOps という3つの言葉で押さえます。学習データを集めるときの落とし穴も一緒に見ます。
AIプロジェクトは、モデルを作るところから始まりません。まず「誰のどんな困りごとを、どうなったら解けたと言えるのか」を決めるところから始まります。シラバスの中項目35でも、キーワードの筆頭に「AIのビジネス活用」と「ステークホルダーのニーズ」が並んでいます。ここを飛ばして精度の高いモデルを作っても、現場が本当に困っていたのは別のところだった、ということが起こります。ステークホルダーとは、経営層・現場の担当者・情報システム部門・顧客・規制当局など、そのAIの影響を受ける関係者すべてを指します。関係者ごとに「成功」の定義が違うので、着手前に目標と評価の物差しをそろえておく必要があります。
AIを入れれば業務がよくなる、とは限りません。今の業務手順をそのまま残したままAIを載せると、AIの出した答えを人が手作業で転記する工程が新たに増えるだけ、ということが実際に起こります。そこで出てくるのがBPR(ビジネスプロセス・リエンジニアリング)です。BPRは、既存の業務プロセスを部分的に改善するのではなく、目的にさかのぼって業務の流れそのものを設計し直す考え方です。AI導入で効果が出るかどうかは、モデルの精度よりも、業務プロセスを組み替えられたかどうかで決まる場面が少なくありません。
データ分析プロジェクトの標準的な進め方として、シラバスはCRISP-DMを挙げています。CRISP-DMは、ビジネス理解・データ理解・データ準備・モデリング・評価・展開という6つの段階からなります。大事なのは、この6つが一方向に流れるだけではなく、前の段階へ戻りながら反復する円環として描かれている点です。データを見て初めて課題設定の甘さに気づく、評価してみて特徴量の作り直しが要ると分かる、ということが普通に起こるからです。機械学習の本番運用まで含めて品質保証の観点を足したものがCRISP-ML(Q)で、シラバスにはCRISP-MLとして載っています。
本格的な開発に入る前に、小さく作って確かめる工程をPoC(Proof of Concept、概念実証)と呼びます。PoCの目的は完成品を作ることではなく、「そもそもこのデータでこの精度は出るのか」「出たとして業務は回るのか」を、少ない投資で判断することです。したがってPoCには、始める前に「どの数字がどこまで届いたら次へ進む、届かなければやめる」という撤退の基準を置いておく必要があります。これがないと、成果の出ないPoCを延々と繰り返すことになります。
開発の進め方には、要件定義から順に工程を固めて後戻りしないウォーターフォールと、短い期間で作って試すことを繰り返すアジャイルがあります。AI開発は、やってみないと精度が分からないという性質を持つため、要件と成果物を先に固定するウォーターフォールとは相性がよくありません。実務では、探索とPoCの部分を反復的に進め、精度が見通せてから本開発の工程を固める、という組み合わせが取られます。この「精度を事前に約束できない」という性質は、後の講義で扱う開発委託契約の型にも直接効いてきます。
道具の側も押さえておきます。開発言語はPythonが事実上の標準で、試行錯誤の記録にはコードと実行結果と説明を1つの文書にまとめられるJupyter Notebookが使われます。ライブラリの版までそろえた実行環境をそのまま持ち運びたいときはDockerでコンテナにします。同じコンテナを開発機でも本番でも動かせるので、「自分の環境では動いたのに」という食い違いが減ります。計算資源はクラウドから必要な分だけ借り、学習済みモデルは Web API として公開して、他システムからHTTPで呼び出せる形にするのが一般的です。
作って終わりではありません。運用に入ると、世の中が変わって入力データの傾向が学習時とずれていき、精度が静かに落ちていきます。これを見張り、必要なら学習データを更新して作り直し、また配置する、という循環を仕組みとして回す考え方がMLOpsです。監視の対象はサーバーの死活だけではなく、入力データの分布、予測の分布、業務指標まで含みます。誰がいつどのデータでどのモデルを作ったかを記録しておくことも、MLOpsが担う仕事です。
体制も論点です。データサイエンティストは、統計や機械学習の知識に加え、業務の理解とデータ基盤の扱いを併せ持つ職種として位置づけられます。ただし1社ですべての知見をそろえるのは難しいので、シラバスは「産学連携」「他企業や他業種との連携」「オープン・イノベーション」を並べています。オープン・イノベーションは、自社内の研究開発だけに閉じず、外部の技術・知識・人材を積極的に取り込んで価値を生む考え方です。産学連携は大学など研究機関との共同研究、他業種との連携は自社にないデータや販路を持つ相手との組み合わせを指します。
最後にデータです。教師あり学習に必要な正解ラベルを人手で付ける作業をアノテーションと呼びます。ラベルの付け方の基準が作業者ごとにぶれると、モデルの上限がそこで決まってしまうので、作業指示書と品質チェックの設計が要になります。ゼロから集める代わりに、公開されているオープンデータセットや、言語処理向けに大量の文章を集めて整理したコーパスを使う手もあります。ただし、どのデータにもライセンスと利用規約が付いているので、商用利用や再配布の可否を必ず確認します。
データの扱いでとくに怖いのがデータリーケージです。これは、予測時点では本来手に入らないはずの情報が学習データに混ざり込み、検証時の精度が実力よりずっと高く出てしまう現象です。解約予測に「解約手続きの受付日」を特徴量として入れてしまう、前処理の平均や標準偏差を検証データも含めた全体から計算してしまう、時系列データを時間を無視してランダムに分割してしまう、といった形で起こります。過学習は「訓練データに合わせすぎる」ことが原因ですが、データリーケージは「そもそも使ってはいけない情報を使っている」ことが原因で、両者は別物です。検証の数字が不自然に良いときは、まずリーケージを疑います。
import requests
url = "https://example.com/v1/predict"
payload = {"text": "this product works well"}
res = requests.post(url, json=payload, timeout=10)
print(res.status_code)
print(res.json())
| 順序 | 段階 | その段階で決めること |
|---|---|---|
| 1 | ビジネス理解 | 解くべき業務課題、成功の基準、制約と体制 |
| 2 | データ理解 | 使えるデータの所在、品質、分布、不足しているもの |
| 3 | データ準備 | 欠損や外れ値の処理、特徴量の作成、学習用と検証用の分割 |
| 4 | モデリング | 手法の選択、ハイパーパラメータの調整、学習の実施 |
| 5 | 評価 | 業務目標に照らした達成度、次へ進むか前へ戻るかの判断 |
| 6 | 展開 | 業務システムへの組み込み、運用と監視の設計、引き継ぎ |
- ステークホルダーのニーズ
- 経営層・現場・情報システム部門・顧客など、そのAIの影響を受ける関係者それぞれが求めるもの。着手前に目標と評価の物差しをそろえる対象。
- BPR
- ビジネスプロセス・リエンジニアリング。既存の業務手順を部分改善するのではなく、目的にさかのぼって業務の流れ自体を設計し直す取り組み。
- CRISP-DM
- データ分析プロジェクトの標準プロセスモデル。ビジネス理解・データ理解・データ準備・モデリング・評価・展開の6段階を反復する。
- CRISP-ML
- CRISP-DMを機械学習の本番運用まで広げ、各段階に品質保証の観点を加えたプロセスモデル。CRISP-ML(Q)とも書かれる。
- PoC
- 概念実証。本格開発の前に小規模に試して、実現可能性と効果を確かめる工程。始める前に次へ進む条件と撤退の条件を決めておく。
- ウォーターフォール
- 要件定義から順に工程を固め、後戻りしないことを前提に進める開発の進め方。成果物と要件を先に確定できる案件に向く。
- アジャイル
- 短い期間で作って試すことを繰り返す開発の進め方。やってみないと精度が分からないAI開発の探索段階と相性がよい。
- Python
- AI開発で事実上の標準となっている言語。機械学習やデータ処理のライブラリが充実している。シラバスの中項目35のキーワード。
- Jupyter Notebook
- コードと実行結果と説明文を1つの文書にまとめて残せる対話的な開発環境。試行錯誤の過程を記録しながら分析を進められる。
- Docker
- アプリケーションとライブラリを含む実行環境をコンテナとしてまとめる技術。開発機と本番で同じ環境を再現できる。
- Web API
- 学習済みモデルの機能を、HTTP経由で他システムから呼び出せる形で公開する仕組み。利用側はモデルの中身を知らずに使える。
- MLOps
- 機械学習モデルの配置・監視・再学習・再配置を継続的に回す運用の考え方。入力データや予測の分布の変化も監視の対象にする。
- データサイエンティスト
- 統計や機械学習の知識に加え、業務の理解とデータ基盤の扱いを併せ持つ職種。シラバスの中項目35のキーワード。
- オープン・イノベーション
- 自社内の研究開発に閉じず、外部の技術・知識・人材を取り込んで価値を生む考え方。産学連携や他業種との連携がその手段になる。
- アノテーション
- 生のデータに正解ラベルや領域情報を人手で付ける作業。基準のぶれがそのままモデルの性能の上限になるため、指示書と品質管理が要る。
- オープンデータセット
- 研究や開発のために公開されているデータの集まり。利用にはライセンスと利用規約の確認が必要で、商用利用の可否は個別に異なる。
- コーパス
- 自然言語処理のために集められ、整理された大量の文章データ。用途に応じて品詞や構文の情報が付与されていることもある。
- データリーケージ
- 予測時点では手に入らないはずの情報が学習データに混入し、検証時の精度が実力より高く出てしまう現象。原因は過学習とは異なる。
例題 工場の検査工程にAIを入れたい、という相談を受けた。現場の担当者は「不良品の見落としを減らしたい」と言い、経営層は「検査にかける人手を半分にしたい」と言っている。着手前に何をすべきか。
この2つは同じ目標ではない。見落としを減らしたいなら、疑わしいものを広めに拾う設定にして再検査を増やすことになり、人手はむしろ増える。人手を半分にしたいなら、明らかに良品のものを自動で通して人の確認を減らすことになり、見落としの許容量を先に決める必要がある。ステークホルダーのニーズが食い違ったまま進めると、完成後にどちらからも「求めていたものと違う」と言われる。着手前にやるべきことは、両者を同席させて、許容できる見落とし率と、削減したい工数の目標値を1つの表に書き出し、優先順位を合意することである。CRISP-DMでいえばビジネス理解の段階にあたり、ここで決めた基準がそのまま評価段階の判定条件になる。加えて、検査工程そのものを組み替えられるかも確認する。AIの判定結果を人が紙に転記するような工程が残ると、削減効果は出ない。これがBPRの視点である。
例題 研究部門のノートPC上で動いている学習済みモデルを、社内の別部署の業務システムから使えるようにしたい。どういう形で渡すのがよいか。
モデルのファイルとスクリプトをそのまま渡す方法は、受け取る側にPythonの環境構築とライブラリの版合わせを強いることになり、動かないという問い合わせが続く。よく取られるのは、推論処理をWeb APIとして公開し、利用側はHTTPで入力を送って結果を受け取るだけにする形である。利用側はモデルの中身も実行環境も知らなくてよく、モデルを差し替えても呼び出し方は変わらない。実行環境はDockerのコンテナにまとめてクラウド上で動かせば、負荷に応じて台数を増やせるうえ、開発機と本番で同じ環境を再現できる。あわせて、入力と出力を記録して分布の変化を見張る仕組みを最初から入れておく。これがMLOpsの入り口になる。
出典:一般社団法人日本ディープラーニング協会「G検定 試験出題範囲(シラバス 2024)」第1.4版(2026年5月11日) 技術分野 AI の社会実装に向けて 35. AI プロジェクトの進め方/一般社団法人日本ディープラーニング協会「G検定 試験出題範囲(シラバス 2024)」第1.4版(2026年5月11日) 技術分野 AI の社会実装に向けて 36. データの収集・加工・分析・学習
AIをめぐる法律と契約
個人情報・著作権・特許・営業秘密、そして開発を外部に頼むときの契約。AIを世に出すまでに必ず通る法律の関門を、制度の建て付けから押さえます。
個人情報保護法は、生存する個人に関する情報の取り扱いのルールを定めた法律です。まず用語の三段階を押さえます。個人情報は、生存する個人に関する情報で、特定の個人を識別できるものです。個人データは、その個人情報を検索できるように体系的に整理したもの(個人情報データベース等)を構成する個人情報です。保有個人データは、事業者が開示や訂正、利用停止などに応じる権限を持つ個人データです。義務の重さはこの順に増えていくので、手元のデータがどこに当たるかで、できること・しなければならないことが変わります。
「氏名が入っていなければ個人情報ではない」というのは誤りです。個人識別符号という区分があり、指紋データや顔認識データ、DNAの塩基配列を変換した符号のような身体的特徴のデータや、マイナンバー、旅券番号、運転免許証番号のような個人に割り当てられた番号は、それ単体で個人情報になります。また、人種・信条・社会的身分・病歴・犯罪の経歴・犯罪被害の事実など、不当な差別や偏見が生じうる情報は要配慮個人情報とされ、取得の場面から原則として本人の同意が要ります。
個人情報を扱うときは、利用目的をできる限り特定し、あらかじめ公表するか本人に通知しなければなりません。学習に使うつもりなら、そのことが利用目的の範囲に収まっているかを確認します。個人データを第三者に渡すときは、原則として本人の同意が必要です。ここで区別が要るのが委託です。利用目的の達成に必要な範囲で取り扱いを外部に委ねる委託は第三者提供に当たらず、本人同意なしに行えますが、その代わり委託元には委託先を監督する義務が生じます。クラウド事業者やアノテーション会社にデータを渡す場面は、この委託として整理されることが多い場面です。
本人の同意なしにデータを広く使いたいときの制度が、匿名加工情報と仮名加工情報です。匿名加工情報は、特定の個人を識別できないように加工し、かつ元の個人情報を復元できないようにしたものです。ここまで加工してあるので、本人の同意なしに第三者へ提供できます。仮名加工情報は、他の情報と照合しない限り特定の個人を識別できないように加工したものです。氏名などを削れば足りるので加工の手間は軽く、元データの分析価値を残せますが、その代わり原則として第三者への提供はできず、事業者の内部での分析利用が想定されています。加工の程度が軽いほど外に出せなくなる、と覚えると取り違えにくくなります。
GDPRは、EUの一般データ保護規則です。日本の個人情報保護法とは別の、EUの法令である点をまず押さえます。そのうえで、EU域内にいる人の個人データを扱う場合には、EU域外の日本企業にも適用されうるという域外適用の性質を持ちます。EU向けにサービスを提供している、あるいはEU域内の人の行動を監視しているといった事情があれば、日本国内で開発していても対象になり得ます。
著作権法に移ります。著作物とは、思想または感情を創作的に表現したもので、文芸・学術・美術・音楽の範囲に属するものです。ここで効いてくるのが創作性で、単なる事実やデータそのもの、ありふれた表現には著作物性が認められません。プログラムのソースコードは著作物になり得ますが、アルゴリズムそのものは表現ではないので著作権では保護されません。他人の著作物を無断で複製したり公衆に送信したりすれば著作権侵害になりますが、法律はいくつかの場合に権利を制限しています。
AI開発でいちばん重要な条文が著作権法 第30条の4です。この条文は、著作物に表現された思想または感情を自ら享受し、または他人に享受させることを目的としない場合には、必要と認められる限度で、方法を問わずその著作物を利用できると定めています。そして第2号に情報解析が明示されており、大量の著作物からデータを抽出して統計的に解析する行為、つまり機械学習のための学習用データの作成と学習がここに当たります。「享受」とは、著作物に表現された思想や感情を鑑賞して知的・精神的な満足を得ることを指し、学習のためにデータとして読み込む行為はそれに当たらない、という整理です。
ただし、これを「AI学習ならどんな利用でも自由」と読んではいけません。第30条の4には、当該著作物の種類および用途ならびに当該利用の態様に照らし著作権者の利益を不当に害することとなる場合は、この限りでない、というただし書きが付いています。たとえば、情報解析用に販売されているデータベースを買わずに複製して学習に使うような場合は、そのデータベースの市場を害するので、ただし書きに当たると考えられています。さらに、学習という入力段階が適法であっても、生成物が既存の著作物と類似していれば、生成・利用という出力段階では通常どおり著作権侵害が問題になります。入力段階と出力段階は別々に評価される、というのがこの分野の基本の型です。文化庁の「AIと著作権に関する考え方について」が、この整理を詳しく示しています。
生成物の側の論点がAI生成物の著作物性です。著作権は人間の創作的な表現を保護する制度なので、AIが自動的に出力しただけのものは著作物になりません。他方、人間が表現上の本質的な特徴を与えたと言える程度に関与していれば、その成果物に著作物性が認められる余地があります。判断の鍵になるのが創作的寄与で、指示や試行錯誤の具体性、生成物の選択や修正の度合いなどが個別に見られます。「AIが作ったものは常に著作物である」も「AIが作ったものは決して著作物にならない」も、どちらも誤りです。なお、学習や生成のためにサービスを使うときは、著作権法とは別に、そのサービスの利用規約が生成物の扱いを定めていることがあるので、両方を見る必要があります。
特許法は発明を保護します。発明は自然法則を利用した技術的思想の創作のうち高度なものとされ、特許を受けるには新規性(出願前に公然と知られていないこと)と進歩性(その分野の通常の技術者が容易に思いつくものでないこと)が要ります。学会発表やプレスリリースを先に出してしまうと自らの発明の新規性を失わせることがあるので、出願との順序が実務上の勘所になります。著作権が表現を保護し、出願も登録もなしに創作と同時に発生するのに対し、特許権はアイデア(技術的思想)を保護し、出願と審査を経て登録されて初めて発生します。両者は保護する対象も発生の仕方も違うので、AIの成果物は片方に当たり、もう片方には当たらないということが普通に起こります。
従業者が職務としてした発明を職務発明といいます。特許を受ける権利は原則として発明者である従業者に生じますが、あらかじめ勤務規則などで定めておけば、発生した時から使用者に帰属させることもできます。その場合、従業者には相当の金銭その他の経済上の利益を受ける権利が認められます。使用者が対価なしに権利を取り上げられる制度ではありません。
技術を守る方法は特許だけではありません。不正競争防止法は営業秘密を保護します。営業秘密と認められるには、秘密として管理されていること(秘密管理性)、事業活動に有用な技術上または営業上の情報であること(有用性)、公然と知られていないこと(非公知性)の3つをすべて満たす必要があります。学習済みモデルの重みや学習データの前処理の工夫のように、公開したくない情報はこちらで守ることになります。特許は公開と引き換えに独占を得る制度、営業秘密は公開しないことで守る制度なので、どちらを選ぶかは戦略の問題です。
3要件を満たさなくても、複数の相手に反復して提供されるデータには保護の道があります。同じ不正競争防止法の限定提供データがそれで、業として特定の者に提供する情報で、電磁的方法により相当量蓄積され、管理されているものが対象です。データを売買・共有する取引を保護するために設けられた区分で、秘密として囲い込む営業秘密とは想定している場面が異なります。また、AIとデータをめぐっては独占禁止法も論点になります。データを持つ事業者が競合の参入を難しくする形で取引を拒んだり条件を付けたりすると、競争制限や公正競争阻害性の観点から問題とされ得ます。
最後に契約です。AI開発を外部に委託するとき、精度をどこまで約束できるかが最大の争点になります。請負契約は仕事の完成を約束する契約で、完成しなければ報酬を請求できず、契約に適合しない成果物には修補などの責任を負います。準委任契約は事務の処理を委託する契約で、約束するのは仕事の完成ではなく、善良な管理者の注意をもって業務を遂行することです。AI開発では、学習してみるまで到達できる精度が分からないため、探索やPoCの段階は準委任契約で進め、仕様が固まった実装工程を請負契約にするという分け方がよく取られます。経済産業省の「AI・データの利用に関する契約ガイドライン」が、アセスメント・PoC・開発・追加学習という段階に分けた契約の型を示しており、シラバスにもこの名称で載っています。開発の前段でデータや情報を交換するときはNDA(秘密保持契約)を結び、納品後の面倒を見る範囲は保守契約で定めます。
自社が作ったAIをサービスとして提供する側に回ると、論点が変わります。SaaS型では、ソフトウェアの所有権を渡すのではなく、利用する権利を継続的に提供します。そのため、利用者が入力したデータを提供者が自社モデルの改善に使ってよいかというデータ利用権の定めが要になります。ここを利用規約で明確にしていないと、後から利用者との間で紛争になります。精度保証についても、開発委託の場合と同様に、どの条件下でどの指標がどの水準を満たすのかを具体的に書くか、あるいは保証しないことを明示するかを決めておきます。
| 区分 | 加工の程度 | 本人同意なしの第三者提供 |
|---|---|---|
| 個人情報・個人データ | 加工しない | 不可(原則として本人の同意が必要) |
| 仮名加工情報 | 他の情報と照合しない限り識別できない程度 | 不可(原則。内部での分析利用が想定) |
| 匿名加工情報 | 識別できず、かつ復元もできない程度 | 可(所定の公表等の手続を行う) |
- 個人情報
- 生存する個人に関する情報で、氏名や生年月日などにより特定の個人を識別できるもの。個人識別符号が含まれるものもこれに当たる。
- 個人データ
- 検索できるように体系的に整理された個人情報データベース等を構成する個人情報。安全管理措置や第三者提供の規律がここに掛かる。
- 保有個人データ
- 事業者が開示・訂正・利用停止などに応じる権限を持つ個人データ。本人からの請求に対応する義務が生じる。
- 個人識別符号
- 指紋・顔認識データ・DNAの塩基配列を変換した符号や、マイナンバー・旅券番号などの番号。それ単体で個人情報になる。
- 要配慮個人情報
- 人種・信条・社会的身分・病歴・犯罪の経歴など、不当な差別や偏見が生じうる情報。取得の段階から原則として本人の同意が要る。
- 第三者提供
- 個人データを自社以外の者に渡すこと。原則として本人の同意が必要。委託や事業承継に伴う提供は第三者提供に当たらない。
- 委託
- 利用目的の達成に必要な範囲で個人データの取り扱いを外部に委ねること。第三者提供に当たらない代わりに、委託先を監督する義務が生じる。
- 匿名加工情報
- 特定の個人を識別できず、かつ元の個人情報を復元できないように加工した情報。本人の同意なしに第三者へ提供できる。
- 仮名加工情報
- 他の情報と照合しない限り特定の個人を識別できないように加工した情報。原則として第三者提供はできず、内部での分析利用が想定される。
- GDPR
- EUの一般データ保護規則。日本の法律ではないが、EU域内にいる人の個人データを扱う場合には域外の事業者にも適用されうる。
- 創作性
- 著作物と認められるための要件の一つ。単なる事実やありふれた表現には認められず、作り手の個性が表れている必要がある。
- 著作権法 第30条の4
- 思想または感情を自ら享受し他人にも享受させることを目的としない利用を認める規定。第2号に情報解析が明示され、ただし書きがある。
- AI生成物
- AIが出力した成果物。著作物性は人間の創作的寄与の有無で個別に判断され、常に著作物になるとも、決してならないとも言えない。
- 新規性・進歩性
- 特許の要件。新規性は出願前に公然と知られていないこと、進歩性はその分野の通常の技術者が容易に思いつくものでないこと。
- 職務発明
- 従業者が職務としてした発明。勤務規則等で定めれば権利を発生時から使用者に帰属させられるが、従業者には相当の利益を受ける権利がある。
- 営業秘密
- 不正競争防止法が守る情報。秘密管理性・有用性・非公知性の3要件をすべて満たす必要がある。公開せずに守る点が特許と対照的。
- 限定提供データ
- 業として特定の者に提供する、電磁的方法により相当量蓄積され管理されているデータ。営業秘密の3要件を満たさなくても保護されうる。
- 請負契約
- 仕事の完成を約束する契約。完成しなければ報酬を請求できず、契約に適合しない成果物には責任を負う。仕様が固まった工程に向く。
- 準委任契約
- 事務の処理を委託する契約。約束するのは完成ではなく、善良な管理者の注意をもって業務を遂行すること。探索やPoCの段階に向く。
- AI・データの利用に関する契約ガイドライン
- 経済産業省が示した、AI開発とデータ提供の契約の考え方。段階を分けて契約する型を示す。シラバスに名称が載っている資料。
- データ利用権
- SaaS型のAIサービスで、利用者が入力したデータを提供者がどこまで使えるかを定める権利関係。利用規約で明確にしておく必要がある。
例題 自社のAIサービスがある業界で圧倒的なシェアを持つようになり、そのサービスに蓄積されたデータが競合にとって欠かせないものになった。ここで独占禁止法が問題になるのはどういう場面か。
独占禁止法の観点でシラバスが挙げているのは、競争制限と公正競争阻害性の2つである。データを持つ事業者が、正当な理由なく競合へのデータ提供を拒む、あるいは自社サービスを併せて買うことを条件にする、取引先に競合と取引しないよう求める、といった行為をすると、市場での競争を人為的に制限したり、公正な競争を妨げたりするものとして問題になり得る。ここで大事なのは、シェアが高いこと自体は違法ではないという点である。良いサービスを作って選ばれた結果としての高いシェアは、競争の成果であって規制の対象ではない。問題になるのは、そのシェアを維持するために競争そのものを妨げる手段を使ったときである。AIの分野では、学習データの囲い込みや、モデルへのアクセス条件の設定がこの観点から議論されている。
例題 自社の需要予測モデルをSaaSとして他社に提供する。利用企業が入力した販売実績を、自社モデルの改善のための再学習に使いたい。何を決めておく必要があるか。
決めるべきことは3つある。第一に、入力データを再学習に使ってよいかを利用規約に明記する。SaaSはソフトウェアそのものを渡すのではなく利用する権利を継続的に提供する形なので、事業者の手元にデータが集まる。ここを黙って使うと信頼を失い、紛争にもなる。オプトアウトの手段を用意するか、使わない選択ができる料金体系にするのが一般的である。第二に、入力データに個人情報が含まれる場合は、個人情報保護法の観点で整理する。利用企業のために処理するだけなら委託の枠に収まるが、自社モデルの改善という自社のための利用は委託の範囲を超えるので、利用企業側で本人への説明と同意の手当てが要るかを確認する。第三に、精度保証である。学習データが利用企業ごとに違えば精度も変わるので、どの条件下でどの指標がどの水準を満たすのかを書くか、保証しないことを明示するかを決めておく。
出典:一般社団法人日本ディープラーニング協会「G検定 試験出題範囲(シラバス 2024)」第1.4版(2026年5月11日) 法律・倫理分野 AIに関する法律と契約 1. 個人情報保護法、2. 著作権法、3. 特許法、4. 不正競争防止法、5. 独占禁止法、6. AI開発委託契約、7. AIサービス提供契約/著作権法 第30条の4/文化庁「AIと著作権に関する考え方について」
AI倫理とAIガバナンス
法律で決まっていないところをどう律するか。プライバシー・公平性・安全性・透明性という論点と、それを組織で回す仕組みを見ます。
法律・倫理分野の後半は、法令に書かれていない領域の話です。ここでまず押さえるのがハードローとソフトローの区別です。ハードローは、国家が定め違反に強制力が及ぶ法令のことで、個人情報保護法や著作権法がこれに当たります。ソフトローは、ガイドライン・業界の自主規範・企業の行動指針のように、法的な拘束力を持たない規律です。技術の変化が速い分野では、法律を作って施行するまでの間に前提が変わってしまうため、まずソフトローで方向を示し、必要なところだけ法律にするという進め方が取られます。日本のAI政策は基本的にこのソフトロー中心です。なお2025年には、AIの研究開発と活用を推進するための法律が成立していますが、これは研究開発と利活用を後押しする推進法であって、行為を禁じて違反者を罰する規制法ではなく、罰則規定も置かれていません。この点は、リスクの大きさに応じて禁止や義務を課すEUの規則とは性格が異なります。総務省と経済産業省が示している事業者向けのガイドラインも、名前のとおりガイドラインであってソフトローです。
規制の考え方として重要なのがリスクベースアプローチです。これは、AIの用途がもたらすリスクの大きさに応じて規制や対応の強度を変えるという考え方です。同じ顔認識技術でも、スマートフォンの画面ロック解除と、公共空間での常時監視とでは、人に及ぶ影響がまるで違います。用途を問わず一律に規制すると、害の小さい使い方まで止めてしまってイノベーションを損ない、逆に一律に緩めると害の大きい使い方を放置することになります。そこで、影響の大きい用途には強い義務を、小さい用途には軽い扱いを割り当てます。事業者の側でも、社内のAI案件をリスクの高さで区分し、高リスクのものだけ厳しい審査に回す、という形で同じ考え方を使います。
プライバシーは、個人情報保護法が守る範囲より広い概念です。法律に触れていなくても、人が「そこまで見られたくない」と感じることはあります。対応の基本になるのがプライバシー・バイ・デザインで、問題が起きてから対策を足すのではなく、企画・設計の段階からプライバシー保護を組み込むという考え方です。データを集めない設計にする、必要な期間で消す、識別できない形で処理する、といった判断は後から入れるほど高くつきます。シラバスは、データ収集段階と推論段階で問題の所在が違うことも挙げています。集めるときの問題は、本人が知らないうちに撮られる・記録されることであり、推論するときの問題は、集めた情報から本人が明かしていない属性を推定してしまうことです。カメラ画像については、経済産業省などが公表しているカメラ画像利活用ガイドブックが、撮影していることの告知の仕方や、生活者とのコミュニケーションの取り方を具体的に示しています。
公平性は、AIの出力が特定の属性の人に不利に働かないかという論点です。原因は大きく2つに分けられます。1つはデータの偏りで、そもそも学習データが現実の人口構成を反映していない場合です。特定の層のデータばかり集まってしまうことをサンプリングバイアスと呼びます。もう1つは、モデルや設計の側で生じるアルゴリズムバイアスです。過去の採用実績を学習すれば、過去の人事判断に含まれていた偏りをそのまま再生産します。
ここで最も間違えやすいのが、性別や人種のようなセンシティブ属性を入力から取り除けば公平になる、という発想です。これは成り立ちません。郵便番号は居住地域を通じて人種や所得と強く相関し、出身校や部活動の履歴は性別と相関することがあります。こうした、センシティブ属性の代わりとして働いてしまう特徴量を代理変数と呼びます。代理変数が残っている限り、モデルは間接的に同じ差別を学習します。したがって公平性の確認は、入力の項目を削ることではなく、出力を属性ごとに集計して差を測ることで行います。さらに厄介なことに、公平性の定義は1つではありません。属性ごとの合格率をそろえる、属性ごとの誤り率をそろえる、同じスコアの人を同じ確率で扱う、といった複数の定義があり、一般にはこれらを同時にすべて満たすことはできません。どの定義を採るのかを、用途に照らして選んで説明することが求められます。
安全性とセキュリティでは、AI特有の攻撃を区別できることが問われます。Adversarial Attack(Adversarial Examples)は、人間の目にはほとんど分からない微小な変化を入力に加えて、モデルに誤った判定をさせる攻撃です。運用中のモデルの入力側を狙う攻撃で、モデルそのものは書き換えません。データ汚染は、学習に使われるデータに細工したものを紛れ込ませて、学習の結果を攻撃者の望む方向にゆがめる攻撃です。学習段階を狙う点が決定的に違います。モデル汚染は、モデルのパラメータや配布物そのものに手を入れて挙動を変えるものです。データ窃取は、モデルの出力を観察するなどして学習データに含まれていた情報を取り出す攻撃、モデル窃取は、大量に問い合わせて出力を集め、同等の働きをするモデルを手元に再現してしまう攻撃です。前者は学習データが、後者はモデル自体が盗まれます。これらへの備えも、設計段階からセキュリティを組み込むセキュリティ・バイ・デザインの考え方で進めます。
悪用の代表がディープフェイクです。深層学習を使って、実在する人物が言っていないことを言い、していないことをしているかのような映像や音声を作り出す技術と、その生成物を指します。名誉毀損や詐欺、選挙への干渉に使われ、フェイクニュースの説得力を跳ね上げます。対策としては、検出技術の研究に加えて、撮影機器や生成時点で来歴情報を埋め込み、後から改変を検証できるようにする方向が進められています。
透明性は、AIが何をどう判断したのかを外から分かるようにすることです。深層学習のモデルは、内部で何が起きているのかを人が追いにくいブラックボックスになりがちです。融資の審査や採用の選考のように、結果が人の生活を左右する場面では、なぜその結論になったのかを説明できることが求められます。これが説明可能性です。あわせて重要なのがデータの来歴で、どのデータをどこから取得し、どう加工して学習に使ったかを記録しておくことを指します。来歴が残っていなければ、問題が起きたときに原因のデータまでたどり着けません。透明性は、モデルの内部を公開することだけを意味するのではなく、何のために使っているのか、どんなデータで作ったのか、どこに限界があるのかを対象に応じて示すことまで含みます。
民主主義への影響として挙げられるのがエコーチェンバーとフィルターバブルです。エコーチェンバーは、同じ意見を持つ人どうしが閉じた空間で発信と共感を繰り返すうちに、その意見が唯一正しいものだと信じ込んでいく現象です。反響室で音が響き合う様子にたとえた言葉で、原因は人が似た者どうしで集まるという性質にあります。フィルターバブルは、推薦アルゴリズムが利用者の好みに合わせて情報を選別した結果、その人が泡に包まれたように自分好みの情報しか見えなくなる現象です。こちらの原因はアルゴリズムによる最適化であり、利用者は選別されていること自体に気づきません。原因がアルゴリズムの側にあるのはフィルターバブルのほうだ、という点が両者を分ける鍵です。
そのほかの価値も、シラバスは中項目として立てています。環境保護では、大規模モデルの学習が消費する電力と、それに伴う二酸化炭素の排出が気候変動の観点から議論されています。労働政策では、雇用が奪われるかどうかだけでなく、AIとの協働の形をどう設計するか、労働力不足を補う手段としてどう使うか、そして人がAIに頼りきることで自分の判断力や技能を失っていくスキルの喪失が論点です。その他の重要な価値としては、障害の有無や言語にかかわらず使えるようにするインクルージョン、自律型兵器をめぐる軍事利用、故人の映像や声を生成することの是非という死者への敬意、そしてAIの推薦や誘導によって人の選択が方向づけられることへの人間の自律性が挙げられています。
これらを個人の心がけに任せず、組織の仕組みとして回すのがAIガバナンスです。出発点はAIポリシーで、自社がAIをどう扱うのかという方針を文書にして公表します。個別の案件については、企画の段階で影響を洗い出す倫理アセスメントを行い、リスクの高いものは審査に回します。運用が始まったら、出力の傾向や苦情をモニタリングし、想定と違う挙動が出ていないかを見張ります。判断の要所には人間の関与を残し、AIの結論をそのまま実行するのではなく人が確認して覆せるようにします。作ったモデルを後から再び作れるように、データ・コード・設定・乱数の種まで残しておくことが再現性で、どのデータからどのモデルを経てどの判断が出たのかを追えるようにしておくことがトレーサビリティです。そして、これらが方針どおり運用されているかを、担当部署から独立した立場で確かめるのがAIに対する監査です。設計や評価に関わる人の顔ぶれが偏っていると見落としが生まれるため、ダイバーシティも体制づくりの要件として挙げられています。
| 攻撃 | 狙う時点 | 起きること |
|---|---|---|
| Adversarial Attack | 推論(運用中) | 微小な変化を加えた入力で誤った判定をさせる |
| データ汚染 | 学習 | 細工した学習データを混ぜて学習結果をゆがめる |
| モデル汚染 | 学習・配布 | モデルのパラメータや配布物に手を入れて挙動を変える |
| データ窃取 | 推論(運用中) | 出力の観察などから学習データの情報を取り出す |
| モデル窃取 | 推論(運用中) | 大量の問い合わせから同等のモデルを手元に再現する |
- ハードロー
- 国家が定め、違反に強制力が及ぶ法令。個人情報保護法や著作権法がこれに当たる。改正には時間がかかる。
- ソフトロー
- ガイドライン・業界の自主規範・企業の行動指針など、法的な拘束力を持たない規律。変化の速い分野で先に方向を示す役割を担う。
- リスクベースアプローチ
- 用途がもたらすリスクの大きさに応じて、規制や社内対応の強度を変える考え方。一律規制とも一律放任とも異なる。
- 価値原則
- 各国や各機関のAIガイドラインに共通して現れる、守るべき価値の柱。人間中心、公平性、透明性、安全性などが繰り返し挙げられる。
- プライバシー・バイ・デザイン
- 問題が起きてから対策するのではなく、企画・設計の段階からプライバシー保護を組み込む考え方。
- カメラ画像利活用ガイドブック
- カメラ画像を扱う事業者向けに、告知の仕方や生活者とのコミュニケーションの取り方を示した資料。シラバスに名称が載っている。
- サンプリングバイアス
- データを集める過程で特定の層に偏りが生じ、学習データが現実の分布を反映しなくなること。公平性の問題の主要な原因の一つ。
- アルゴリズムバイアス
- モデルや設計の側に起因して不公平な出力が生じること。過去の判断を学習することで、その偏りを再生産する場合も含まれる。
- センシティブ属性
- 性別・人種・年齢・障害の有無など、それによる不利益な取り扱いが許されない属性。公平性の評価はこの属性ごとに出力を集計して行う。
- 代理変数
- センシティブ属性の代わりとして働いてしまう特徴量。郵便番号が居住地域を通じて人種や所得と相関する例が典型。
- Adversarial Attack
- 人間には気づけない微小な変化を入力に加えて、運用中のモデルに誤った判定をさせる攻撃。Adversarial Examples とも呼ばれる。
- データ汚染
- 学習に使われるデータに細工したものを紛れ込ませ、学習結果を攻撃者の望む方向にゆがめる攻撃。狙うのは学習段階である。
- モデル窃取
- 対象のモデルに大量に問い合わせて入出力を集め、同等の働きをするモデルを手元に再現してしまう攻撃。
- データ窃取
- モデルの出力を観察するなどして、学習データに含まれていた情報を取り出す攻撃。盗まれるのはモデルではなくデータである。
- セキュリティ・バイ・デザイン
- 設計の段階からセキュリティ対策を組み込む考え方。プライバシー・バイ・デザインと対になる概念。
- ディープフェイク
- 深層学習を使い、実在する人物が言っていないことを言い、していないことをしているかのような映像や音声を作り出す技術とその生成物。
- ブラックボックス
- 内部で何が起きているのかを人が追いにくい状態。深層学習のモデルは規模が大きく、判断根拠が直接には読み取れない。
- データの来歴
- どのデータをどこから取得し、どう加工して学習に使ったかの記録。透明性の確保と、問題発生時の原因追跡の土台になる。
- エコーチェンバー
- 同じ意見を持つ人どうしが閉じた空間で発信と共感を繰り返し、その意見が唯一正しいと信じ込んでいく現象。
- フィルターバブル
- 推薦アルゴリズムによる最適化の結果、自分好みの情報しか見えなくなる現象。原因がアルゴリズムの側にある点がエコーチェンバーとの違い。
- 倫理アセスメント
- AIの企画段階で、想定される影響やリスクを洗い出して評価する手続き。結果に応じて審査の厳しさを変える。
- 人間の関与
- AIの結論をそのまま実行せず、要所で人が確認し、必要なら覆せるようにしておくこと。影響の大きい判断ほど強く求められる。
- トレーサビリティ
- どのデータからどのモデルを経てどの判断が出たのかを、後から追跡できるようにしておくこと。
- AIに対する監査
- AIの開発と運用が方針どおりに行われているかを、担当部署から独立した立場で確かめる仕組み。
例題 大規模なモデルを社内で開発し、四半期ごとにゼロから学習し直す運用を計画している。環境保護の観点からは、どのような論点があるか。
シラバスが環境保護の中項目に挙げているのは、気候変動とモデル学習の電力消費の2つである。大規模モデルの学習には長時間にわたって多数の計算機を動かす必要があり、その電力消費と、電源構成に応じた二酸化炭素の排出が問題として議論されている。したがって論点は3つに整理できる。第一に、そもそもゼロからの再学習が必要かという点である。追加分のデータでの追加学習や、既存の事前学習済みモデルの流用で足りるなら、消費は桁で変わる。第二に、いつどこで計算するかという点である。再生可能エネルギーの比率が高い地域や時間帯に学習を寄せる運用が取られている。第三に、測って公開するかという点である。学習にかかった消費電力や排出量を見積もって開示する取り組みが広がっている。なお、推論の側も見落とせない。1回あたりの消費は小さくても、利用回数が多ければ累計では学習を上回ることがあるため、モデルの軽量化は環境の観点からも意味を持つ。
例題 熟練の検査員が担っていた判定をAIに任せたところ、若手が自分で判断する機会がなくなり、AIが停止したときに誰も判定できない状態になった。労働政策とその他の重要な価値の観点で、何が問題か。
労働政策の観点では、これはスキルの喪失にあたる。AIに任せることで人の技能が育たず、あるいは失われていく現象で、雇用の総量が減るかどうかとは別の問題である。ここで求められるのは、人をAIに置き換える設計ではなく、AIとの協働の設計である。たとえば、AIの判定に確信度を付けて低いものだけ人に回す、一定割合は人が独立に判定して突き合わせる、判定の根拠を提示して人が学べるようにする、といった形が考えられる。労働力不足への対処としてAIを使う場合も、残る人の技能をどう維持するかを同時に決めておく必要がある。その他の重要な価値としては、人間の自律性が関わる。AIの提示した結論に人が無条件で従うようになると、形の上では人が決めていても実質的にはAIが決めていることになる。AIガバナンスの語でいえば人間の関与にあたり、AIの結論を確認し、必要なら覆せる権限と能力を人の側に残しておくことが要件になる。
出典:一般社団法人日本ディープラーニング協会「G検定 試験出題範囲(シラバス 2024)」第1.4版(2026年5月11日) 法律・倫理分野 AI倫理・AIガバナンス 8. 国内外のガイドライン、9. プライバシー、10. 公平性、11. 安全性とセキュリティ、12. 悪用、13. 透明性、14. 民主主義、15. 環境保護、16. 労働政策、17. その他の重要な価値、18. AIガバナンス
Pythonの型と文字列
試験の全体像と、Pythonを動かす最初の一歩
この試験が何を主教材にし、どの章を厚く問うのかが分かります。あわせて、インタープリタの動かし方、print の sep と end、コメントとインデントという、以降ずっと使い続ける土台を固めます。
Python 3 エンジニア認定基礎試験は、一般社団法人Pythonエンジニア育成推進協会が実施する、Pythonの文法基礎を問う試験です。いちばん大事な性質は、出題範囲が特定の1冊の本に紐づいていることです。主教材はオライリー・ジャパンの『Pythonチュートリアル 第4版』で、協会の公式ページには、どの章から何問出るかまで公開されています。つまりこの試験は「Pythonの何でも屋になれ」という試験ではなく、「この本の内容を、章ごとの重みに沿って正確に読めるか」を見る試験です。だから対策も、範囲外のライブラリに手を伸ばすのではなく、本に書いてある挙動を実際に動かして確かめる方向に振るのが正解になります。
章別の配分を見ると、力の入れどころははっきりしています。最も多いのは4章「制御構造ツール」で9問、割合にして22.5パーセントです。次が5章「データ構造」の7問、17.5パーセント。その次が3章「気楽な入門編」の6問、15.0パーセントです。この3つだけで22問、全体の55パーセントを占めます。さらに8章「エラーと例外」と10章「標準ライブラリめぐり」が各4問で、合わせて8問、20パーセント。逆に13章「次はなに?」は0問で、ここからは1問も出ません。6章と9章が各2問、残りの1章・2章・7章・11章・12章・14章は各1問です。数え上げると合計40問になります。この配分は公式が公開している出題範囲そのものなので、学習時間の割り振りにそのまま使えます。
本ラボのこのブロックが扱うのは、1章・2章・3章にあたる部分です。問題数でいえば1章と2章が各1問、3章が6問で計8問と、決して多くはありません。しかし3章で登場する数値と文字列の扱いは、4章以降のすべての問題の土台になります。for文の問題であってもループの中で文字列を切り出しますし、例外の問題であっても int() の失敗を題材にします。ここを曖昧にしたまま先に進むと、後半で「何を間違えたのか分からない」という状態に陥ります。配点の少なさに惑わされず、確実に固めてください。
1章と2章は、Pythonを実際に起動して使う話です。端末で python3 とだけ打つと対話モード(インタラクティブモード)に入り、プロンプト記号のあとに式を打つと、その場で評価されて結果が表示されます。抜けるときは exit() または quit() を呼ぶか、UnixならCtrl-D、WindowsならCtrl-Zに続けてEnterを押します。書いたプログラムをファイルにまとめたときは python3 ファイル名.py で実行します。短い1行だけを試したいなら python3 -c "print(1+2)" のように -c オプションにコードを渡す方法もあります。実行中のスクリプトに渡された引数は sys.argv というリストに入り、その先頭 sys.argv[0] はスクリプト名そのものです。ソースファイルの文字コードは既定でUTF-8なので、コメントにも文字列にも日本語をそのまま書けます。Python 2 では既定がASCIIで、日本語を含めるにはファイル先頭に coding 宣言が必要でしたが、Python 3 では不要になりました。
画面に出す道具が print() です。print() は引数をいくつでも受け取り、それらを区切り文字でつないで並べ、最後に終端文字を付けて出力します。区切り文字はキーワード引数 sep で指定し、既定は半角空白1つです。終端文字はキーワード引数 end で指定し、既定は改行文字です。ここで押さえるべきなのは、sep が入るのは引数と引数の「あいだ」だけで、先頭や末尾には付かないという点です。逆に end は必ず末尾に付きます。print('a','b','c') なら a b c と出て改行されますが、sep を空文字列にすれば abc と詰まり、end を空文字列にすれば改行されないので次の print の出力が同じ行に続きます。リストの中身を並べたいときは print(*nums) のようにアスタリスクで展開すると、要素が個別の引数として渡されるため sep の効果を受けます。print(nums) と書くとリストが1つの引数として渡され、角括弧の付いた表現がそのまま出ます。
コメントはシャープ記号で書きます。行の先頭に置けばその行全体が、途中に置けばそれ以降が行末まで無視されます。複数行をまとめてコメントにする専用の構文はなく、行ごとにシャープを置くのが基本です。三重引用符で囲んだ文字列を「ブロックコメントの代わり」に使う書き方もありますが、あれは文法上は文字列リテラルであって、コメントではありません。関数やクラスの先頭に置いた場合は docstring として扱われ、実行時にオブジェクトに保持されます。なお、文字列リテラルの中にシャープが現れてもコメントにはなりません。あくまでコードとして解釈されている位置にあるシャープだけが対象です。
Pythonが他の多くの言語と大きく違うのは、ブロックを波括弧ではなくインデント(字下げ)で表す点です。if や for や def の行はコロンで終わり、その次の行から一段深くした部分がブロックになります。同じブロックに属する文は、字下げ幅をそろえなければなりません。ここが崩れると IndentationError になります。字下げが必要な場所で字下げしなければ expected an indented block、不要な場所で深くすれば unexpected indent、途中で幅が合わなくなれば unindent does not match any outer indentation level という別々のメッセージが出ますが、いずれも IndentationError です。これは実行前の構文解析の段階で見つかるので、エラー行より前にある print も実行されません。字下げにはスペースとタブのどちらも使えますが、混在させると意図しない解釈を生むため、PEP 8 はスペース4つを推奨しています。
最後に注意点を1つ。試験の問題数・試験時間・合格ライン・受験料といった運用上の数字は、協会の裁量で改定されます。2026年8月時点では40問・60分・正答率70パーセントですが、これらは申し込む直前に公式ページで確認すべき情報であり、覚えるものではありません。本ラボでも四択の題材にはしていません。一方、章別の出題配分は出題範囲そのものとして公開されている情報なので、こちらは学習の指針として使えます。
インタープリタの起動と print の基本
$ python3 -V # 使っているバージョンを確かめる
$ python3 # 対話モードに入る
>>> 1 + 2 # 式を打つとその場で評価される
3
>>> exit() # Ctrl-D でも抜けられる
$ python3 hello.py # ファイルにまとめたプログラムを実行
$ python3 -c "print(1 + 2)" # 1行だけ試す
# ---- print の sep と end ----
print(1, 2, 3) # -> 1 2 3 (sep は既定の半角空白)
print(1, 2, 3, sep=' | ') # -> 1 | 2 | 3
print('-' * 5) # -> ----- (文字列の繰り返し)
print('左', end=''); print('右') # -> 左右 (改行を止めて続ける)
| 章 | 章名 | 問題数 | 割合 |
|---|---|---|---|
| 1章 | 食欲をそそってみようか | 1 | 2.5% |
| 2章 | Pythonインタープリタの使い方 | 1 | 2.5% |
| 3章 | 気楽な入門編 | 6 | 15.0% |
| 4章 | 制御構造ツール | 9 | 22.5% |
| 5章 | データ構造 | 7 | 17.5% |
| 6章 | モジュール | 2 | 5.0% |
| 7章 | 入出力 | 1 | 2.5% |
| 8章 | エラーと例外 | 4 | 10.0% |
| 9章 | クラス | 2 | 5.0% |
| 10章 | 標準ライブラリめぐり | 4 | 10.0% |
| 11章 | 標準ライブラリめぐり PartII | 1 | 2.5% |
| 12章 | 仮想環境とパッケージ | 1 | 2.5% |
| 13章 | 次はなに? | 0 | 0.0% |
| 14章 | 対話環境での入力行編集とヒストリ置換 | 1 | 2.5% |
- Python 3 エンジニア認定基礎試験
- Pythonエンジニア育成推進協会が実施する、Pythonの文法基礎を問う試験。出題範囲が主教材の章立てに紐づいており、章ごとの問題数が公開されている。
- 『Pythonチュートリアル 第4版』
- 基礎試験の主教材。オライリー・ジャパン刊。出題範囲はこの本の章番号と章名で示される。
- 対話モード
- 端末で python3 とだけ打って入るモード。式を1つ打つたびに評価され、結果がその場に表示される。exit() や quit()、Ctrl-D で抜ける。
- -c オプション
- python3 -c "print(1+2)" のように、コマンドラインに直接書いたコードを実行させるオプション。1行だけ挙動を確かめたいときに使う。
- sys.argv
- 実行中のスクリプトに渡されたコマンドライン引数が入るリスト。先頭の sys.argv[0] はスクリプト名そのもの。
- sep
- print() のキーワード引数。引数と引数のあいだに挟む区切り文字を指定する。既定は半角空白1つ。先頭と末尾には付かない。
- end
- print() のキーワード引数。出力の末尾に付ける文字を指定する。既定は改行文字なので、空文字列にすると次の出力が同じ行に続く。
- アンパック(アスタリスク展開)
- print(*nums) のように、リストなどの各要素を個別の引数として渡す書き方。sep の効果を受けるようになる。
- コメント
- シャープ記号から行末までの、実行されない注記。複数行専用の構文はなく、行ごとにシャープを置く。文字列リテラルの中のシャープはコメントにならない。
- docstring
- 関数やクラス、モジュールの先頭に置いた文字列リテラル。コメントではなく文字列で、実行時に __doc__ 属性として保持される。
- インデント
- ブロックを表す字下げ。Pythonでは波括弧の代わりにこれで構造を示す。同じブロックの文は幅をそろえる必要がある。
- IndentationError
- 字下げの不整合で起こるエラー。構文解析の段階で検出されるため、エラー行より前の文も実行されない。
- ソースコードのエンコーディング
- Python 3 のソースファイルは既定でUTF-8として読まれる。別の文字コードを使うときだけ、1行目か2行目に coding 宣言を書く。
例題 print('X', 'Y', sep='', end='!') を実行すると、画面には何がどう出るか。改行の有無まで答えなさい。
XY! と出て、改行されない。sep を空文字列にしたので X と Y のあいだに何も挟まらず XY となり、end を '!' にしたので末尾に感嘆符が付く。ここで大事なのは end を指定した時点で既定の改行文字が置き換わってしまう点で、改行も残したければ end='!\n' のように自分で書く必要がある。sep と end は独立したキーワード引数なので片方だけ指定してもよく、指定しなかったほうは既定値のまま働く。
例題 残り2週間で仕上げるとしたら、章別の出題配分を見てどこに時間を割くのが合理的か。
4章(制御構造ツール、9問)と5章(データ構造、7問)と3章(気楽な入門編、6問)で22問、全体の55パーセントを占めるので、まずこの3章を確実に取れる状態にする。次に8章(エラーと例外、4問)と10章(標準ライブラリめぐり、4問)で計8問、20パーセントを押さえると、ここまでで30問、75パーセントに届く。13章は0問なので触らなくてよい。1章・2章・7章・11章・12章・14章は各1問なので、深追いせず用語を眺める程度にとどめる。配点の重みを無視して本を頭から均等に読むと、いちばん出る4章に時間が残らないという事故が起きやすい。
出典:一般社団法人Pythonエンジニア育成推進協会「Python 3 エンジニア認定基礎試験 出題範囲」(2026年8月確認)/Python Software Foundation「Python チュートリアル 2. Python インタプリタを使う」Python 3.14 ドキュメント(2026年8月確認)/Python Software Foundation「Python 標準ライブラリ 組み込み関数」Python 3.14 ドキュメント(2026年8月確認)
数値を正確に扱う - 除算・切り捨て・浮動小数点
int・float・bool・bytes の関係を整理し、3種類の除算、負の数での切り捨ての向き、浮動小数点の誤差、round の偶数丸めという、試験で狙われる落とし穴を一つずつ実行して確かめます。
Pythonの基本的な数値型は int(整数)と float(浮動小数点数)です。1 と書けば int、1.0 と書けば float になり、型は組み込み関数 type() で確かめられます。ここに bool(真偽値)と bytes(バイト列)が加わりますが、この2つには覚えておくべき特別な関係があります。bool は int を継承した型です。つまり True は整数の1として、False は整数の0として、そのまま数値演算に使えます。True + True は 2 になり、isinstance(True, int) は True を返し、issubclass(bool, int) も True です。sum([True, False, True]) が 2 になるのも同じ理屈で、条件を満たした個数を数える書き方としてよく使われます。一方で 1 == True は True ですが、'1' == 1 は False です。文字列と数値は等しくなりません。
int の性質でPythonらしいのが、任意精度であることです。桁数に上限がなく、メモリの許すかぎり大きな値をそのまま正確に扱えます。2 ** 1000 のような値も計算でき、その桁数を len(str(2 ** 1000)) で数えると302桁になります。他の多くの言語のように、64ビットを超えたところで桁があふれて負の値になったり、勝手に float に変わったりすることはありません。型は int のままです。ただし桁が増えるほど計算時間もメモリも増えるので、無制限に速いわけではありません。
つまずきが多いのが除算です。Pythonには3つの演算子があります。スラッシュ1つの / は真の除算で、結果は必ず float になります。ここが重要で、割り切れる場合であっても float です。10 / 5 は 2 ではなく 2.0 で、type(10 / 5) は float を返します。スラッシュ2つの // は床除算で、商を「下方向」に切り捨てます。パーセント記号の % は剰余です。そして divmod(a, b) は (a // b, a % b) のタプル、つまり商と余りを一度に返します。オペランドに float が混じると // の結果も float になり、7.0 // 2 は 3 ではなく 3.0 です。
床除算の「下方向」という言葉が効いてくるのは、負の数のときです。-7 // 2 は -3 ではなく -4 になります。7 / 2 が 3.5、-7 / 2 が -3.5 であることを思い出してください。// は数直線上で小さいほう、つまり下に位置する整数へ寄せるので、3.5 は 3 に、-3.5 は -4 になります。0 に近づける向きではありません。剰余の符号は右辺(除数)の符号に合わせられるので、-7 % 2 は -1 ではなく 1 です。したがって divmod(-7, 2) は (-4, 1) になります。この2つは常に、除数 かける 商 たす 余り が元の値に戻る関係を保ちます。2 かける -4 たす 1 で -7 です。C言語などは0方向へ切り捨てる方式なので、そちらの感覚で解くと必ず1つずれます。
同じ「切り捨て」でも、組み込み関数 int() は向きが違います。int() は小数部を捨てて0に近づけるので、int(-3.9) は -4 ではなく -3 です。正の数では int(3.9) も 3.9 // 1 も同じ3側になるため違いが見えませんが、負の数で分かれます。-3.9 // 1 は -4.0 です。どちらも四捨五入ではないので、-3.9 を -4 にしたいなら round() を使います。この「int() は0方向、// は下方向」という食い違いは、試験でも実務でも定番の落とし穴です。
float には表現の限界があります。コンピュータは小数を2進数で保持するため、0.1 や 0.2 のように10進数では簡潔な値が、2進数では循環小数になって正確に表せません。その結果 0.1 + 0.2 は 0.3 ちょうどにはならず、0.30000000000000004 という値になります。当然 0.1 + 0.2 == 0.3 は False です。これはPythonの欠陥ではなく、IEEE 754 という規格に沿った二進浮動小数点の性質で、多くの言語で同じことが起こります。1.1 + 2.2 も 3.3000000000000003 になります。対策は、等値比較を避けることです。round(0.1 + 0.2, 2) == 0.3 のように必要な桁で丸めてから比べるか、許容誤差を決めて差の絶対値と比べるか、金額のように厳密さが要る場面では decimal モジュールを使います。
round() にも独自の癖があります。Pythonの round() は最近接偶数への丸め、いわゆる銀行家の丸めを行います。ちょうど半分の値のときだけ、近いほうの偶数に寄せるという規則です。round(0.5) は 0、round(1.5) は 2、round(2.5) は 2、round(3.5) は 4、round(4.5) は 4 となります。学校で習う四捨五入なら 2.5 は 3 になるはずですが、Pythonではなりません。この方式は、大量の値を丸めたときに合計が上振れするのを防ぐためのものです。なお第2引数を省略した round() は int を返し、round(2.5, 0) のように桁数を指定すると float の 2.0 が返ります。
数値と文字の橋渡しも3章の範囲です。int('1010', 2) のように第2引数に基数を渡すと、その進法の文字列として読み取れるので結果は 10 になります。逆向きは bin()・oct()・hex() で、それぞれ '0b1010'・'0o10'・'0xff' のように接頭辞の付いた文字列を返します。hex() が返す英字は小文字です。大文字にしたいときは format(255, 'X') と書きます。文字とコードポイントの変換は ord() と chr() で、ord('A') は 65、chr(65) は 'A'、ord('a') は 97 です。
最後に bytes です。b を付けた b'abc' のようなリテラルで書き、文字列を .encode() したものもこれになります。str との違いが問われやすいので押さえてください。bytes に整数の添字でアクセスすると、その位置のバイト値が int として返ります。b'abc'[0] は 'a' ではなく 97 です。一方スライスで取り出すと長さ1の bytes が返るので、b'abc'[0:1] は b'a' です。str なら s[0] も s[0:1] も同じ str になるので、ここが対照的です。また str と bytes は連結できず、'a' + b'a' は TypeError になります。bytes も str と同じくイミュータブルで、要素の代入はできません。可変版が欲しいときは bytearray を使います。マルチバイト文字では文字数とバイト数が一致しないことも重要で、len('あ') は 1 ですが len('あ'.encode()) は 3 です。UTF-8 で日本語のひらがな1文字が3バイトになるためです。
実行して確かめておきたい数値の挙動
# ---- 負の数で向きが分かれる ---- print(-7 // 2) # -4 下方向へ切り捨て print(-7 % 2) # 1 符号は右辺に合わせる print(divmod(-7, 2)) # (-4, 1) print(2 * -4 + 1) # -7 除数 かける 商 たす 余り が元に戻る # ---- 浮動小数点の誤差 ---- print(1.1 + 2.2) # 3.3000000000000003 print(0.1 * 3) # 0.30000000000000004 # ---- round は最近接偶数への丸め ---- print(round(0.5), round(4.5)) # 0 4 # ---- bool は int の仲間 ---- print(sum([True, False, True])) # 2 # ---- 任意精度 ---- print(len(str(2 ** 1000))) # 302 302桁の整数を正確に保持する
| 式 | 結果 | 型 | 理由 |
|---|---|---|---|
| 10 / 5 | 2.0 | float | / は割り切れても float を返す |
| 7 / 2 | 3.5 | float | 同上 |
| 7 // 2 | 3 | int | 下方向へ切り捨て。正の数では0方向と同じ |
| -7 // 2 | -4 | int | 下方向なので -3 ではなく -4 |
| 7.0 // 2 | 3.0 | float | float が混ざると結果も float |
| 7 % 2 | 1 | int | 余り |
| -7 % 2 | 1 | int | 符号は右辺に合わせる |
| divmod(-7, 2) | (-4, 1) | tuple | (a // b, a % b) を返す |
| int(-3.9) | -3 | int | 0方向へ切り捨て。// とは向きが違う |
| -3.9 // 1 | -4.0 | float | 下方向へ切り捨て |
- int
- 整数型。Python 3 では任意精度で、桁数に上限がない。オーバーフローも自動的な float への変換も起こらない。
- float
- 浮動小数点数型。IEEE 754 の二進表現を使うため、0.1 のような10進の小数を正確には保持できない。
- bool
- 真偽値型。int を継承しており、True は 1、False は 0 として数値演算に使える。isinstance(True, int) は True。
- bytes
- バイト列型。b'abc' のように書く。整数の添字ではバイト値が int で返り、スライスでは bytes が返る。イミュータブル。
- 真の除算(/)
- スラッシュ1つの除算。結果は常に float で、割り切れる場合でも 10 / 5 は 2.0 になる。
- 床除算(//)
- スラッシュ2つの除算。商を下方向(数直線上の小さいほう)へ切り捨てる。負の数では -7 // 2 が -4 になる。
- 剰余(%)
- 余りを求める演算子。符号は右辺に合わせられるので、-7 % 2 は 1 になる。
- divmod()
- 商と余りを (a // b, a % b) のタプルで一度に返す組み込み関数。divmod(-7, 2) は (-4, 1)。
- int() の切り捨て
- 小数部を捨てて0に近づける丸め。int(-3.9) は -3 で、下方向へ切り捨てる // とは向きが違う。
- 浮動小数点の誤差
- 2進数で表せない小数が生む誤差。0.1 + 0.2 は 0.30000000000000004 になり、0.3 との等値比較は False になる。
- 最近接偶数への丸め
- round() が採用する丸め方式。ちょうど半分のときは近いほうの偶数へ寄せる。round(2.5) は 2、round(3.5) は 4。
- 基数指定の int()
- int('1010', 2) のように第2引数で基数を渡すと、その進法の文字列として整数に変換する。
- ord() と chr()
- 文字とコードポイントを相互に変換する組み込み関数。ord('A') は 65、chr(65) は 'A'。
- bytearray
- bytes の可変版。要素の代入ができる点が bytes と異なる。
例題 5 / 2、5 // 2、5.0 // 2、int(5 / 2) の4つは、それぞれ何を返すか。値だけでなく型も答えなさい。
5 / 2 は 2.5 で float。/ は常に float を返す。5 // 2 は 2 で int。両辺が int なので床除算の結果も int になる。5.0 // 2 は 2.0 で float。オペランドに float が1つでも混ざると結果は float になり、値としては切り捨てられているが型は float のままである。int(5 / 2) は 2 で int。先に 2.5 を作ってから小数部を捨てている。ここで見てほしいのは、値が「2 のようなもの」であっても、2 と 2.0 は型が違うという点である。print すると 2 と 2.0 で見た目にも差が出る。
例題 -10 % 3 はいくつになるか。C言語のように余りが負になると考えるとどこで間違えるか。
2 になる。Pythonの剰余は、余りの符号を右辺(除数)の符号に合わせるという規則で決まる。除数の 3 が正なので、余りも 0 以上 3 未満の範囲に収まり、2 になる。この値は床除算と対で決まっていて、-10 // 3 が -4 なので、3 かける -4 は -12、-10 に戻すには 2 を足す必要がある、と考えると納得しやすい。0方向へ切り捨てる方式なら商が -3、余りが -1 になるが、Pythonはこの方式をとらない。負の数が絡んだら、まず床除算の商を出してから、そこに何を足せば元に戻るかを考えるのが確実である。
出典:Python Software Foundation「Python 標準ライブラリ 組み込み型」Python 3.14 ドキュメント(2026年8月確認)/Python Software Foundation「Python 標準ライブラリ 組み込み関数」Python 3.14 ドキュメント(2026年8月確認)/Python Software Foundation「Python チュートリアル 15. 浮動小数点演算、その問題と制限」Python 3.14 ドキュメント(2026年8月確認)
文字列を切る・つなぐ・整える
スライスの読み方、イミュータブルであることの意味、f-string の書式、join と split と strip と replace の使い分け、raw文字列、そして find と index の違いまで、文字列の要点を一気に押さえます。
文字列はシングルクォートでもダブルクォートでも書けます。どちらでも意味は同じで、中に片方の記号を含めたいときに、もう片方で囲むと便利という程度の使い分けです。三重引用符で囲めば改行をそのまま含む複数行の文字列になります。文字列を並べて書くと自動で連結され、'Py' 'thon' は 'Python' になります。変数どうしをつなぐときは + 演算子を使い、* 演算子は繰り返しです。'ab' * 3 は 'ababab' になり、あいだに区切りは入りません。'-' * 5 のようにして区切り線を作るのは定番の書き方です。
文字列の一部を取り出すのがスライスです。添字は0から始まり、s[i] で1文字を取り出します。負の添字は末尾から数え、s[-1] が最後の1文字です。s[start:stop] は start の位置から stop の「手前」までを返します。終端が含まれないのがポイントで、s[0:5] は5文字です。start を省略すると先頭から、stop を省略すると末尾までになります。第3の値はステップで、s[::2] なら1つ飛ばし、s[::-1] なら逆順です。文字列の反転を s[::-1] と書けるのは覚えておく価値があります。
スライスで最も間違えやすいのが、範囲外を指定したときの挙動です。単独の添字が範囲外なら IndexError になりますが、スライスは例外になりません。文字列と重なっている部分だけを返し、まったく重ならなければ空文字列を返します。'abc'[100:200] は '' です。start が stop より大きい場合も同じで、s[4:1] は '' になります。存在チェックのつもりでスライスを書くと、エラーにならないまま空文字列が流れていくので、意図した位置を取れているかは長さで確かめるのが安全です。
文字列がイミュータブル(変更不可能)である、という性質は試験の常連です。s[0] = 'z' のような代入はできず、TypeError: 'str' object does not support item assignment になります。同じことがメソッドにも表れます。s.upper() や s.replace() は元の文字列を書き換えるのではなく、新しい文字列を作って返すだけです。ですから s.upper() とだけ書いた行は、作った文字列をどこにも保存せず捨てているのと同じで、s は元のままです。結果を残したければ s = s.upper() のように代入し直します。リストの sort() のように「その場で並べ替えて None を返す」タイプのメソッドとは対照的なので、両方を並べて覚えると混乱しません。
値を文字列に埋め込む書き方は3種類あります。いちばん新しく読みやすいのが f-string で、文字列の前に f を付け、波括弧の中に式を書きます。f'{1+2}' は '3' です。コロンのあとに書式指定を続けられ、f'{3.14159:.2f}' は '3.14' になります。これは切り捨てではなく丸めで、:.3f なら '3.142' です。ビックリマークと r を書く !r という変換指定を使うと、値を repr() で表示します。文字列に対して使えばクォート付きになるので、f'{"ab"!r}' は "'ab'" です。2つ目が str.format() で、'{} and {}'.format(1, 2) のように順に埋め、'{1} {0}'.format('a', 'b') のように番号で順序を入れ替えたり、'{n:.2f}'.format(n=3.14159) のように名前で渡したりできます。書式指定の文法は f-string と共通です。3つ目が古い % 演算子で、'%s-%d' % ('a', 3) のように書きます。
文字列とリストを行き来する道具が split() と join() です。split() は文字列を分割してリストにします。引数を省略した s.split() は、連続する空白をひとまとめの区切りとして扱い、空の要素を作りません。'a b c'.split() は3要素の ['a', 'b', 'c'] です。一方、区切り文字を明示した s.split(' ') は空白1つずつで切るので、連続していると空文字列が残り ['a', 'b', '', 'c'] になります。この違いはよく問われます。第2引数は maxsplit で、分割回数の上限です。'a,b,c'.split(',', 1) は最初の1回だけ切って ['a', 'b,c'] を返します。逆向きが join() で、区切り文字のほうからメソッドを呼びます。','.join(['x', 'y', 'z']) は 'x,y,z' です。渡すのは反復可能オブジェクトなら何でもよく、文字列も1文字ずつを取り出せるので '-'.join('abc') は 'a-b-c' になります。区切りは要素と要素のあいだにだけ入り、先頭や末尾には付きません。要素に文字列以外が混ざると TypeError です。
端の余分な文字を落とすのが strip() です。ここでの落とし穴は、引数が「取り除く文字の集合」だという点です。部分文字列を1つ消すのではなく、両端からその集合に含まれる文字が続くかぎり削り続けます。'xxabxx'.strip('x') は 'ab' になります。'abcba'.strip('ab') と書くと、左端の a と b、右端の a と b が削られて 'c' が残ります。並び順は関係なく、集合として扱われるからです。引数を省略すると空白文字(スペース・タブ・改行)を削ります。左端だけなら lstrip()、右端だけなら rstrip() です。文字列の途中にあるものまで消したいときは strip() ではなく replace() を使います。replace() は該当箇所をすべて置き換え、第3引数で回数の上限を指定できます。
部分文字列を探す方法も複数あります。有無だけを知りたいなら in 演算子がいちばん簡潔で、'Py' in s のように書きます。in は大文字と小文字を区別するので、'py' in 'Python' は False です。位置を知りたいときは find() か index() を使います。返す値は同じですが、見つからなかったときの振る舞いが違います。find() は -1 を返して先に進み、index() は ValueError: substring not found を送出します。エラーで止めたくない場面では find() を、見つからないのが異常事態なら index() を選びます。末尾から探す rfind() と rindex() も同じ関係です。出現回数を数えるだけなら count() があります。
最後にエスケープと raw文字列です。文字列の中でバックスラッシュは特別な意味を持ち、\n は改行1文字、\t はタブ1文字を表します。バックスラッシュそのものを1文字書きたいときは2つ重ねるので、len('\\') は 1 です。ファイルパスや正規表現のようにバックスラッシュが多い文字列では、これを毎回重ねるのが煩雑になります。そこで文字列リテラルの前に r を付けた raw文字列を使うと、バックスラッシュがエスケープの開始として解釈されなくなります。r'a\nb' は a、バックスラッシュ、n、b の4文字なので len は 4 で、通常の 'a\nb' は a、改行、b の3文字なので len は 3 です。r を付けても文字列の型は str のままで、特別な型になるわけではありません。
文字列の切り出しと検索、f-string と raw文字列
s = 'Hello, Python' # 13文字
print(s[7:]) # Python 添字7から末尾まで
print(s[-6:]) # Python 末尾から6文字
print(s[::-1]) # nohtyP ,olleH 反転
print(s.split(', ')) # ['Hello', 'Python']
print(s.find('Ruby')) # -1 見つからない
print(s.index('Python')) # 7 見つかった位置
print('python' in s) # False 大文字小文字を区別する
name = 'めぇ'
score = 91.5
print(f'{name}さんは{score:.1f}点') # めぇさんは91.5点
print(len('C:\tmp'), len(r'C:\tmp')) # 5 6 \t がタブか2文字かの違い
| 式 | 結果 | 間違えやすい点 |
|---|---|---|
| 'a,,b'.split(',') | ['a', '', 'b'] | 区切りが連続すると空文字列が残る |
| 'x y z'.split() | ['x', 'y', 'z'] | 引数なしは連続空白をまとめる |
| ','.join(['x', 'y']) | 'x,y' | 呼ぶのは区切り文字の側 |
| 'abcba'.strip('ab') | 'c' | 引数は集合。両端から削り続ける |
| ' ab '.strip() | 'ab' | 省略時は空白文字を削る |
| 'strawberry'.find('grape') | -1 | 見つからなくても例外にならない |
| 'strawberry'.index('raw') | 2 | 位置の返し方は find() と同じ |
| 'Hello, Python'[::-1] | 'nohtyP ,olleH' | ステップ -1 で反転できる |
| 'HELLO' in 'Hello' | False | in は大文字小文字を区別する |
| len(r'C:\tmp') | 6 | raw文字列ではバックスラッシュも1文字 |
- スライス
- s[start:stop:step] で部分文字列を取り出す記法。stop の位置は含まれない。step に -1 を指定すると逆順になる。
- 範囲外のスライス
- スライスは範囲が長さを超えても例外にならず、重なる部分だけを返す。まったく重ならなければ空文字列。単独の添字なら IndexError。
- イミュータブル
- 生成後に中身を変更できない性質。str はイミュータブルなので、添字への代入は TypeError になる。
- f-string
- 文字列の前に f を付け、波括弧に式を書いて埋め込む記法。コロンのあとに書式指定、!r で repr() 表示を指定できる。
- 書式指定 :.2f
- 小数点以下の桁数を指定して丸める書式。切り捨てではない。f-string と str.format() で共通に使える。
- split()
- 文字列を分割してリストにするメソッド。引数なしは連続空白をまとめ、区切り文字を明示すると空文字列が残る。第2引数は maxsplit。
- join()
- 区切り文字の側から呼び、反復可能オブジェクトの要素をつなぐメソッド。区切りは要素と要素のあいだにだけ入る。
- strip()
- 両端から文字を取り除くメソッド。引数は「取り除く文字の集合」であり、部分文字列ではない。省略すると空白文字を削る。
- replace()
- 部分文字列を別の文字列に置き換えて、新しい文字列を返すメソッド。第3引数で置換回数の上限を指定できる。
- in 演算子
- 部分文字列が含まれるかを真偽値で返す演算子。大文字と小文字を区別する。
- find() と index()
- 部分文字列の位置を返すメソッド。見つからないとき find() は -1 を返し、index() は ValueError を送出する。
- エスケープシーケンス
- バックスラッシュで始まる特別な表記。\n は改行、\t はタブを表し、バックスラッシュ自体は2つ重ねて書く。
- raw文字列
- リテラルの前に r を付けた文字列。バックスラッシュがエスケープとして解釈されない。型は通常の str のまま。
例題 s = 'Hello, Python' のとき、s[0:5]、s[-6:]、s[100:200]、s[5:2] はそれぞれ何を返すか。
s[0:5] は 'Hello'。添字0から始めて添字5の手前まで、つまり5文字を取り出す。s[-6:] は 'Python'。負の添字は末尾から数えるので、末尾から6文字目を始点として最後までになる。s[100:200] は ''。文字列は13文字しかなく範囲がまったく重ならないが、スライスは例外にならず空文字列を返す。s[5:2] も '' で、始点が終点より後ろにあるときも同様に空文字列になる。単独の添字 s[100] なら IndexError になるので、そこが対照的である。スライスは黙って空を返すので、期待した長さが取れているかは len() で確かめる習慣をつけたい。
例題 ' Python ' の前後の空白を消したい。strip() と replace(' ', '') はどう違うか。'abcba'.strip('ab') が 'c' になる理由も説明しなさい。
strip() は両端だけを対象にするので、' Python '.strip() は 'Python' になり、語の中に空白があってもそこは残る。replace(' ', '') は文字列全体からすべての空白を消すので、'a b'.replace(' ', '') は 'ab' になってしまう。単語の区切りを保ちたいなら strip() を選ぶ。'abcba'.strip('ab') が 'c' になるのは、引数が「取り除く文字の集合」だからである。部分文字列 'ab' を1回消すのではなく、左端から a、b と続くかぎり削り、右端からも a、b と続くかぎり削る。その結果、両端が食い尽くされて中央の c だけが残る。集合なので 'ba' と書いても結果は同じで、順序は関係ない。
出典:Python Software Foundation「Python 標準ライブラリ 組み込み型」Python 3.14 ドキュメント(2026年8月確認)/Python Software Foundation「Python チュートリアル 3. 形式ばらない Python の紹介」Python 3.14 ドキュメント(2026年8月確認)/Python Software Foundation「Python 言語リファレンス 2. 字句解析」Python 3.14 ドキュメント(2026年8月確認)
制御構造とデータ構造
制御構造 if for while と else 節
条件で分ける if、繰り返す for と while、そして Python 独特の for/else。break と continue と pass の使い分けまで、処理の流れを操る道具が一通り分かります。
プログラムは書いた順に上から流れますが、それだけでは仕事になりません。条件によって道を分け、同じ処理を必要な回数だけ繰り返す。この2つを受け持つのが制御構造です。Python の分岐は if で始まり、途中の条件は elif、どれにも当てはまらない場合は else に書きます。elif はいくつ並べてもよく、else は無くてもかまいません。上から順に判定され、最初に真になったブロックだけが実行されます。
条件に書けるのは真偽値だけではありません。Python は値そのものに真偽を持たせていて、0・空の文字列・空のリスト・空の辞書・None は偽として扱われ、それ以外はおおむね真です。ですから if len(items) > 0 と書かなくても if items で通じます。ここを知っていると、後で出てくる and と or の話がつながります。
for は「反復可能なものから1つずつ取り出して変数に入れる」文です。C言語のようにカウンタを自分で増やす形ではありません。回数を決めて回したいときは range を使います。range(stop) は 0 から stop の手前まで、range(start, stop) は start から stop の手前まで、range(start, stop, step) は step ずつ進みます。stop は含まれません。step に負の数を入れれば逆順になります。なお range が返すのはリストではなく range 型のオブジェクトで、必要な数をその都度作ります。中身を並べて見たいときは list() に通します。
while は条件が真である間だけ繰り返します。回数が決まっていないとき、たとえば入力が正しくなるまで聞き直すような場面に向きます。条件に使っている変数を本体の中で変え忘れると、いつまでも終わらないので注意してください。ループの中では break でループそのものを打ち切り、continue でその回の残りをとばして次の反復に進みます。何もしないことを明示したいときは pass を置きます。pass は構文上ブロックが必要なのに書くことがない場所の穴埋めで、break や continue のように流れを変える働きはありません。
ここからが Python 独特の話です。for と while には else 節を付けられます。この else は「条件が偽のとき」ではなく、「break されずにループが終わったとき」に実行されます。探し物をするループで、見つかったら break、最後まで見つからなければ else で見つからなかった旨を出す、という書き方が定番です。気をつけたいのは、反復の対象が空でも else は実行されるという点です。1回も回らなければ break もしていないのですから、Python の理屈では当然の帰結になります。逆に break で抜けたときだけ else はスキップされます。
比較演算子は数学の書き方のようにつなげられます。1 < x < 5 は (1 < x) and (x < 5) と同じ意味で、しかも x は1度しか評価されません。値を選ぶだけなら三項演算子も使えます。書き方は 真のときの値 if 条件 else 偽のときの値 で、条件が真ん中に来る並びに慣れておいてください。
最後に and と or です。この2つは True や False を返すのではなく、評価をやめた時点の値をそのまま返します。or は左から見て最初に真になった値を返し、最後まで真が無ければいちばん右の値を返します。and は逆に最初に偽になった値を返し、すべて真なら最後の値を返します。真偽が決まった時点で右側を評価しないので短絡評価と呼ばれ、name or 'ゲスト' のような既定値の書き方に使われます。
scores = [80, 95, 60]
for s in scores:
if s < 50:
print("赤点あり")
break
else:
print("全員合格")
# 50 未満が1つも無いので break されず、else が動いて 全員合格 が出る
| ループの終わり方 | 何が起きるか | else 節 |
|---|---|---|
| 条件が偽になって終わる | ループを正常に抜ける | 実行される |
| 反復の対象が空だった | 本体が1回も動かない | 実行される |
| continue で最後まで回った | 各回の残りをとばしただけ | 実行される |
| break で抜けた | ループを途中で打ち切る | スキップされる |
- elif
- else if の短縮形。いくつ並べてもよく、上から順に判定されて最初に真になったブロックだけが実行される。
- range
- 整数の並びを表す組み込み型。range(start, stop, step) の stop は含まない。リストではないので、並べて見るときは list() に通す。
- break
- いま入っているループを打ち切って外に出る文。else 節が付いていても、break で抜けた場合はスキップされる。
- continue
- その回の残りの処理をとばして次の反復に進む文。ループ自体は続くので、else 節は通常どおり実行される。
- pass
- 何もしない文。構文上ブロックが必要なのに書くことがないときの穴埋めに使う。流れを変える働きはない。
- for/else
- for に付ける else 節。break されずにループが終わったときに実行される。反復対象が空のときも実行される。
- 連鎖比較
- a < b < c のように比較をつなげる書き方。and でつないだのと同じ意味になり、真ん中の式は1度しか評価されない。
- 三項演算子
- 値1 if 条件 else 値2 という形の式。条件が真なら値1、偽なら値2になる。文ではなく式なので、そのまま代入や引数に書ける。
- 短絡評価
- and と or が、真偽が決まった時点で右側の評価をやめる仕組み。返るのは True や False ではなく、評価をやめた時点の値そのもの。
例題 例題: while ループが条件で自然に終わったときだけ後片付けをしたい。break で抜けたときは何もしたくない。どう書くか。
while の本体の後ろに else 節を付け、そこに後片付けを書きます。else はループが break されずに終わったときだけ実行されるので、break で抜けた回はスキップされます。フラグ変数を1つ用意して break の直前で立て、ループの後で if フラグ と書く方法もありますが、else 節を使えばその変数が要りません。while だけでなく for でも同じように書けます。
例題 例題: total = 0 or None or [] を評価すると、total には何が入るか。
or は左から順に評価して、最初に真になった値を返します。0 も None も空のリストもすべて偽なので、真の値は1つも見つかりません。この場合はいちばん右の値がそのまま返るので、total には空のリストが入ります。True でも False でもない点が大事です。and と or は真偽値ではなく、評価をやめた時点の値を返します。
出典:Python Software Foundation「Python チュートリアル 4. その他の制御フローツール」Python 3.14 ドキュメント(2026年8月確認)
反復の道具 enumerate zip 内包表記
番号を振る enumerate、2つを並べて回す zip、1行で新しい入れ物を作る内包表記。そして「イテレータは1回で尽きる」という落とし穴が分かります。
for でリストを回していると、要素と一緒に何番目かも欲しくなります。range(len(items)) を回して添字で取り出す書き方もできますが、Python では enumerate を使うのが普通です。enumerate は反復可能なものを受け取り、(番号, 要素) というタプルを次々に返します。for i, item in enumerate(items) と2つの変数で受けるのが定型です。番号は既定で 0 から始まりますが、第2引数 start を渡せばそこから数え始めます。画面に通し番号を出すときは start に 1 を指定すると、そのまま人間向けの番号になります。
2つの並びを同時に回したいときは zip です。zip は渡された反復可能なものから1つずつ取り出して組にします。3つ以上渡せば3要素以上のタプルになります。ここで大事なのは、長さが違うときの振る舞いです。zip は短い方に合わせて打ち切ります。余った要素は静かに捨てられ、エラーにも None での穴埋めにもなりません。長さが違うことに気づかないままデータを落としてしまう事故があるので、揃っているはずのデータなら長さを確かめてから渡す習慣を付けてください。
zip の結果を dict() に渡すと、キーの並びと値の並びから辞書ができます。dict(zip(keys, values)) はよく出てくる定型句です。ここでも短い方に合わせるので、キーの数と値の数が違えば、できる辞書の項目数は少ない方に合わせた数になります。
enumerate と zip が返すのはリストではありません。map や filter やジェネレータと同じ、イテレータと呼ばれる仕組みです。イテレータは前から順に1回だけ取り出せる使い切りの通路だと思ってください。一度取り出したものは戻ってきません。ですから同じ変数に対して list() を2回呼ぶと、1回目は中身が並んだリストになり、2回目は空のリストになります。何度も使いたいときは、最初に list() で受け止めて普通のリストにしておきます。この振る舞いは試験でもよく問われます。
新しいリストを作りたいだけなら、空のリストを用意して for で append する代わりに内包表記が書けます。[式 for 変数 in 反復可能なもの] という形で、後ろに if を付ければ条件に合うものだけを残せます。for を2つ並べれば二重ループになり、左に書いた for が外側のループです。読み方は「左端の式を、右側のループの分だけ作る」です。
波括弧を使えば辞書や集合も同じ形で作れます。{キー: 値 for ...} と書けば辞書内包表記、{値 for ...} と書けば集合内包表記です。集合内包表記では重複が自動的に消えるので、変換後の種類数を数えるような用途に向きます。
ここで引っかかりやすいのが丸括弧です。(式 for ...) と書いてもタプルはできません。これはジェネレータ式で、型は generator になります。Python にタプル内包表記という書き方は無く、タプルが欲しければ tuple(...) で包みます。ジェネレータ式は全要素を先に作らず、求められたときに1つずつ計算するので大きなデータでも省メモリですが、やはりイテレータなので使い切りです。
names = ["ume", "take", "matsu"]
prices = [300, 500]
for no, (n, p) in enumerate(zip(names, prices), 1):
print(no, n, p)
# 1 ume 300
# 2 take 500
# 値段の側が2つしか無いので matsu は組にならず、静かに落ちる
| 書き方 | 呼び名 | できるものの型 |
|---|---|---|
| [x for x in it] | リスト内包表記 | list |
| {x for x in it} | 集合内包表記 | set |
| {k: v for k, v in it} | 辞書内包表記 | dict |
| (x for x in it) | ジェネレータ式 | generator |
- enumerate
- 反復可能なものから (番号, 要素) のタプルを順に返す組み込み関数。第2引数 start で数え始める値を指定でき、省略すると 0 から。
- zip
- 複数の反復可能なものから1つずつ取って組にする組み込み関数。長さが違うときは最も短いものに合わせて打ち切る。
- イテレータ
- 前から順に1つずつ値を取り出せる仕組み。取り出したものは戻らないので使い切りになる。enumerate・zip・map・filter・ジェネレータがこれにあたる。
- リスト内包表記
- [式 for 変数 in 反復可能なもの] という形で新しいリストを作る書き方。後ろに if を付けると絞り込みができる。
- 辞書内包表記
- {キー: 値 for ...} という形で辞書を作る書き方。コロンがあるかどうかで集合内包表記と区別される。
- 集合内包表記
- {値 for ...} という形で集合を作る書き方。重複した値は自動的に1つにまとまる。
- ジェネレータ式
- (式 for ...) という形。タプルではなく generator を作る。値を1つずつ計算するので省メモリだが、イテレータなので一度使うと尽きる。
例題 例題: it に map の結果を入れ、print(len(list(it))) を書いた次の行で print(list(it)) を書いたら、2つ目が空のリストになった。なぜか。
map が返すのはリストではなくイテレータで、前から1回だけ取り出せる使い切りの通路だからです。1つ目の list() で最後まで取り出してしまったので、2つ目の list() には何も残っていません。回数を数えたうえで中身も使いたいなら、先に data = list(it) と普通のリストで受け止めて、その data を2回使います。zip・filter・ジェネレータでも同じことが起きます。
例題 例題: tuple(c * 2 for c in "xy") は何になるか。丸括弧の中身は何か。
丸括弧の中身はジェネレータ式であって、それ自体はタプルではありません。tuple() に渡して初めてタプルになるので、結果は ('xx', 'yy') です。Python にタプル内包表記という書き方は無いので、丸括弧で囲めばタプルができると思い込むのが典型的な誤りです。型を確かめたいときは type() に通すと generator と表示されます。
出典:Python Software Foundation「Python チュートリアル 5. データ構造」Python 3.14 ドキュメント(2026年8月確認)
リストとタプル 変わるものと変わらないもの
append と extend の違い、sort() が None を返す理由、スライスへの代入、1要素タプルのカンマ、そして浅いコピーの落とし穴が分かります。
リストとタプルはどちらも順番のある入れ物ですが、決定的な違いが1つあります。リストは後から中身を変えられるミュータブルな型で、タプルは変えられないイミュータブルな型です。タプルの要素に代入しようとすると TypeError になります。書き換えないと決めたデータをタプルにしておくと、うっかり壊す事故を型の側で防げます。
リストに要素を足す方法は2つあり、ここが最初の分かれ道です。append は引数をまるごと1つの要素として末尾に足します。extend は引数を反復して、取り出した値を1つずつ足します。リストを append すれば入れ子になって長さが1増え、同じリストを extend すれば中身がほどけて長さがその分増えます。文字列を extend すると1文字ずつばらばらに入るので、意図しない結果になりがちです。
次が最頻出の罠です。リストをその場で作り変えるメソッドは、作り変えた結果ではなく None を返します。sort() も reverse() も append() も extend() も insert() も、返るのは None です。ですから x = names.sort() と書くと x には None が入り、並べ替えたリストは names の側にあります。並べ替えた新しいリストが欲しいときは組み込み関数の sorted() を使います。sorted() は元のリストを一切変えず、新しいリストを返します。同じ関係が reverse() と reversed()、あるいはスライスによる逆順にもあります。
位置を指定して出し入れする道具も押さえておきます。insert(i, v) は i の位置に割り込ませ、それ以降の要素を後ろにずらします。pop() は末尾を取り除いてその値を返すので、破壊的でありながら値を返す数少ないメソッドです。pop(0) と書けば先頭を取り出せます。値が要らないなら del lst[i] で消せます。del は関数ではなく文なので、戻り値という考え方自体がありません。
スライスは範囲を指す書き方で、読むだけでなく代入や削除の対象にもできます。スライスに代入すると、その範囲がまるごと右辺の中身に置き換わります。左辺の幅と右辺の長さが違ってもよく、リストの長さがその分だけ変わります。範囲を2要素から1要素に置き換えれば全体は1つ縮み、幅0のスライスに代入すればその位置への挿入になります。del lst[1:3] と書けば範囲をまとめて削除できます。
タプルは丸括弧ではなくカンマで決まります。(1) は括弧で囲んだだけの整数で、型は int です。(1,) と末尾にカンマを置いて初めてタプルになります。空のタプルだけは () と書きます。もう1つ、タプルが不変であることの意味も正確に理解しておいてください。タプルが凍らせているのは「どの要素を指すか」であって、指した先の中身までは凍りません。タプルの中にリストが入っていれば、そのリストに append することはできます。
最後にコピーです。b = a は新しい入れ物を作らず、同じものに別の名前を付けるだけです。b = a[:] や copy.copy(a) は浅いコピーで、外側の入れ物は新しくなりますが、中の要素は元と同じものを共有します。ですから内側のリストを書き換えると、元の側にも見えてしまいます。内側まで切り離したいときは copy.deepcopy を使います。同じ理屈で、[[0] * 3] * 2 は同じリストを2回並べるだけなので、片方の行を変えるともう片方も変わります。行ごとに別のリストを作るなら [[0] * 3 for _ in range(2)] と書きます。
import copy
table = [["a"], ["b"]]
shallow = table[:]
deep = copy.deepcopy(table)
shallow[0].append("X")
deep[1].append("Y")
print(table) # [['a', 'X'], ['b']] 浅いコピー側の変更が元に見えている
print(shallow) # [['a', 'X'], ['b']]
print(deep) # [['a'], ['b', 'Y']] 深いコピー側の変更は元に届かない
| 書き方 | 元のリスト | 戻り値 |
|---|---|---|
| lst.sort() | 並べ替わる | None |
| sorted(lst) | 変わらない | 並べ替えた新しいリスト |
| lst.reverse() | 逆順になる | None |
| lst[::-1] | 変わらない | 逆順の新しいリスト |
| lst.pop() | 末尾が消える | 取り出した要素 |
| del lst[0] | 先頭が消える | 文なので戻り値は無い |
- ミュータブル
- 作った後で中身を変えられる性質。リスト・辞書・集合がこれにあたる。
- イミュータブル
- 作った後で中身を変えられない性質。タプル・文字列・数値がこれにあたる。ただしタプルの中のリストは変更できる。
- append
- 引数をまるごと1つの要素として末尾に足すリストのメソッド。戻り値は None。
- extend
- 引数を反復して取り出した値を1つずつ末尾に足すリストのメソッド。戻り値は None。
- sorted
- 並べ替えた新しいリストを返す組み込み関数。元のリストは変わらない。その場で並べ替えるメソッドの sort() とは別物。
- スライス代入
- lst[i:j] = [...] という形で範囲をまるごと置き換える書き方。左辺の幅と右辺の長さが違ってもよく、リストの長さが変わる。
- 浅いコピー
- 外側の入れ物だけを新しく作り、中の要素は元と共有するコピー。lst[:] や copy.copy() がこれにあたる。
- 深いコピー
- 入れ子の中身まで再帰的に複製するコピー。copy.deepcopy() で行う。元とまったく共有しない。
例題 例題: ranking = names.sort() と書いたら ranking が None になった。何を直せばよいか。
sort() はリストをその場で並べ替えたうえで None を返すメソッドだからです。並べ替えた結果は names の側に入っています。names.sort() だけを実行してから names を使うか、元のリストを残したいなら ranking = sorted(names) と書きます。reverse() や append() も同じく None を返すので、メソッドの戻り値を変数で受ける書き方を見たら疑ってください。
例題 例題: 3人分の空の持ち物リストを作ろうと bags = [[]] * 3 と書き、bags[0] に1つ足したら3人とも同じものを持ってしまった。どう書くか。
[[]] * 3 は空のリストを3つ作るのではなく、同じ1つの空リストへの参照を3つ並べただけだからです。どれを変えても同じ実体を変えていることになります。bags = [[] for _ in range(3)] と内包表記で書けば、繰り返しのたびに新しいリストが作られるので3つが独立します。掛け算でリストを増やしたときは、中身がミュータブルかどうかを必ず確かめてください。
出典:Python Software Foundation「Python チュートリアル 5. データ構造」Python 3.14 ドキュメント(2026年8月確認)
辞書と集合 キーで引く入れ物
添字ではなくキーで引く辞書と、重複を持たない集合。get と setdefault の違い、in が何を見ているか、そして空の波括弧が何になるかが分かります。
辞書はキーと値の組を並べた入れ物です。リストが0から始まる番号で引くのに対し、辞書は自分で決めたキーで引きます。d[key] で取り出し、d[key] = value で追加または上書きします。既にあるキーに代入すれば上書きになり、無いキーに代入すれば新しい項目が増えます。取り出すときだけは事情が違い、無いキーを d[key] で引くと KeyError になります。
この KeyError を避ける道具が2つあります。get は、キーがあればその値を返し、無ければ None を返します。第2引数を渡せば、無いときにその値を返します。もう1つの setdefault は、キーがあれば既存の値を返して辞書を変えず、無ければ第2引数を入れてからその値を返します。読むだけなら get、無ければ作りたいなら setdefault、と覚えると迷いません。集計で d[k] = d.get(k, 0) + 1 と書き、グループ分けで d.setdefault(k, []).append(v) と書くのが定型です。
辞書を見て回るときは items keys values を使います。items は (キー, 値) のタプルを返すので、for k, v in d.items() と2つの変数で受けます。keys はキーだけ、values は値だけです。辞書をそのまま for に渡すとキーが順に取り出されるので、keys は省略されることもあります。なお Python 3.7 以降、辞書は挿入した順序を保ちます。
in 演算子は辞書に対してキーだけを見ます。値がいくら一致していても、キーに無ければ False です。1 in {'a': 1} が False になるのはそのためで、値を調べたいなら 1 in d.values() と明示します。ここは試験でも実務でも取り違えやすいところです。
辞書の作り方はいくつかあります。波括弧のリテラルで直接書く方法のほか、dict(a=1, b=2) のようにキーワード引数から作る方法、dict([('a', 1), ('b', 2)]) のように組の並びから作る方法があります。キーワード引数の形は書きやすい反面、キーが識別子として書ける文字列に限られます。またリテラルの中で同じキーを2度書いた場合はエラーにならず、後に書いた方が残ります。
集合は重複を持たない入れ物です。リストを set() に通すと重複が消えるので、種類の数を数えるときに便利です。集合どうしは演算子でまとめて扱えます。縦棒は和集合でどちらかにあるもの、アンパサンドは積集合で両方にあるもの、マイナスは差集合で左にだけあるもの、ハットは対称差でどちらか一方にだけあるものです。部分集合かどうかは不等号で調べられます。
最後に2つの落とし穴です。1つは、空の波括弧 {} は空の辞書だということ。要素が無いと辞書とも集合とも決められないので、Python は辞書として扱います。空の集合が欲しいときは set() と書きます。もう1つは、集合の要素と辞書のキーはハッシュ可能でなければならないということ。数値・文字列・タプルは入れられますが、リストや辞書を入れようとすると unhashable type という TypeError になります。中身が変わりうるものは、キーとしての置き場所が定まらないからです。集合と辞書の表示順に意味を求めないことも合わせて覚えておいてください。
stock = {}
for item in ["pen", "note", "pen", "clip", "pen"]:
stock[item] = stock.get(item, 0) + 1
print(stock) # {'pen': 3, 'note': 1, 'clip': 1}
group = {}
for k, v in [("fruit", "ume"), ("veg", "nasu"), ("fruit", "kaki")]:
group.setdefault(k, []).append(v)
print(group) # {'fruit': ['ume', 'kaki'], 'veg': ['nasu']}
| 書き方 | キーが有るとき | キーが無いとき | 辞書は変わるか |
|---|---|---|---|
| d[k] | 値を返す | KeyError になる | 変わらない |
| d.get(k) | 値を返す | None を返す | 変わらない |
| d.get(k, v) | 値を返す | v を返す | 変わらない |
| d.setdefault(k, v) | 値を返す | v を返す | 無いときだけ増える |
- 辞書
- キーと値の組を持つ入れ物。キーで値を引く。無いキーを角括弧で引くと KeyError になる。
- get
- キーがあれば値を、無ければ None または第2引数の値を返す辞書のメソッド。辞書自体は変わらない。
- setdefault
- キーがあれば既存の値を返し、無ければ第2引数を入れてから返す辞書のメソッド。無いときだけ辞書が増える。
- items
- 辞書から (キー, 値) の組を順に取り出すメソッド。for k, v in d.items() の形で使う。
- 集合
- 重複を持たない入れ物。リストを set() に通すと重複が消える。要素はハッシュ可能でなければならない。
- 対称差
- 2つの集合のどちらか一方にだけある要素を集めたもの。ハット記号で書き、両方にある要素は落ちる。
- ハッシュ可能
- 内容から一定の値を計算でき、その値が変わらない性質。数値・文字列・タプルは該当し、リストや辞書は該当しない。
例題 例題: 商品名ごとの個数を数えようと count[name] += 1 と書いたら、最初の商品で KeyError になった。どう直すか。
+= は右辺で count[name] を読んでから足すので、まだ登録されていないキーでは読む時点で KeyError になります。count[name] = count.get(name, 0) + 1 と書けば、無いときは 0 から数え始められます。先に count.setdefault(name, 0) を呼んでおく方法もあります。標準ライブラリの collections.defaultdict(int) を使えば、未知のキーが自動的に 0 で始まります。
例題 例題: 2つの名簿 A と B から、片方にしか載っていない人だけを取り出したい。どの演算を使うか。
対称差を使います。A ^ B と書けば、A だけにいる人と B だけにいる人が集まり、両方に載っている人は落ちます。ついでに整理しておくと、両方にいる人は A & B、A にだけいる人は A - B、全員をまとめたいなら A | B です。名簿がリストなら set() に通してから演算し、結果を並べて見せたいときは sorted() で順序を決めます。
出典:Python Software Foundation「Python チュートリアル 5. データ構造」Python 3.14 ドキュメント(2026年8月確認)
関数・モジュール・入出力
関数を定義して呼び出す
位置引数とキーワード引数、デフォルト引数、*args と **kwargs の受け取り方が分かり、ミュータブルなデフォルト引数がなぜ前の呼び出しを覚えているのかを説明できるようになります。
関数は、いくつかの手順にひとつの名前を付けて、あとから何度でも呼び出せるようにする道具です。def のあとに関数名と丸括弧を書き、括弧の中に受け取る値の名前(仮引数)を並べ、字下げした本体に処理を書きます。呼び出す側は本体の中身を知らなくてよく、どんな値を渡せば何が返ってくるかだけを知っていれば使えます。この「呼び出し側と中身を切り離す」ことが関数のいちばんの目的で、変更したいときに直す場所がひとつで済むようになります。
値の渡し方には、書いた順に対応させる位置引数と、名前を指定して渡すキーワード引数の2つがあります。仮引数に等号で値を書いておくとデフォルト引数になり、呼び出し側が省略したときにその値が使われます。ひとつの呼び出しの中では位置引数を先に、キーワード引数をあとに書きます。定義のほうにも決まりがあり、デフォルト値を持つ仮引数のうしろにデフォルト値を持たない仮引数を置くことはできません。これを書くと実行前の構文解析の段階で SyntaxError となり、そのファイルは1行も実行されません。実行してみるまで気づかない種類の誤りではなく、その場で止まる誤りです。
個数を決めずに受け取りたいときは、仮引数の前に星印を付けます。星1つの仮引数には、対応しきれなかった位置引数がタプルとしてまとめて入ります。星2つの仮引数には、対応しきれなかったキーワード引数が辞書としてまとめて入ります。名前は args と kwargs が慣習ですが、決まりではありません。大事なのは受け取る型のほうで、余りが1つも無かったときは空のタプルと空の辞書になり、None にはなりません。星1つと星2つを両方書くときは、必ず星1つを先に書きます。
呼び出す側でも星印が使えます。リストやタプルの前に星1つを付けると、その中身が位置引数として1つずつ配られます。辞書の前に星2つを付けると、キーと同じ名前の仮引数へ値が配られます。定義側の星は「散らばった値を1つにまとめる」働き、呼び出し側の星は「1つにまとまった値を散らばらせる」働きで、向きがちょうど逆になっています。同じ記号なので混同しやすい場所です。星を付け忘れるとリストそのものが最初の仮引数にまるごと入ってしまい、エラーにならないまま結果だけがおかしくなります。
ここからが、この節でいちばん間違えやすいところです。デフォルト値の式は、関数を呼ぶたびに評価されるのではなく、def の行が実行されたときに1回だけ評価され、その結果が関数オブジェクトに保存されます。保存先は __defaults__ という属性で、タプルとして持たれます。デフォルト値が数値や文字列のような変更できない値であれば、1回しか評価されなくても困りません。ところがリストや辞書のような変更できる値を書くと、その1つのオブジェクトがすべての呼び出しで共有されます。本体の中で append すると、次に呼んだときも前回の要素が残ったままになります。__defaults__ を表示すると、中身が増えていく様子をそのまま確認できます。
同じ理由から、デフォルト値に外側の変数を書いた場合も、def を実行した時点の値が焼き付けられます。あとでその変数を書き換えても、関数のデフォルト値は変わりません。この2つはどちらも「デフォルト値は定義時に1回だけ評価される」というひとつの規則から出てきます。ミュータブルなデフォルト引数を避けたいときの定石は、デフォルト値を None にしておき、本体の先頭で None かどうかを確かめて、None なら新しい空のリストを作ることです。こうすると呼び出しごとに別のリストが作られ、呼び出し側が明示的にリストを渡したときはそれを使う、という両方の要求を満たせます。
戻り値は return で返します。return を1度も通らずに関数が終わると、戻り値は None になります。print で表示しているだけの関数を代入して使おうとしてつまずくのは、この None が原因です。return のうしろにカンマ区切りで複数の値を書くと、それらはタプルにまとめられて1つの値として返ります。呼び出し側で同じ数の名前に代入すれば、まとめて受け取れます。返り値が複数あるように見えても、Python が返しているのはあくまで1つのタプルです。
関数まわりの小道具も押さえておきます。lambda は名前を持たない小さな関数を式の中で作る書き方で、本体には式を1つだけ書きます。sorted の key のように、関数を引数として渡したいときによく使います。関数本体の最初に文字列リテラルを置くと docstring になり、__doc__ 属性から読み出せます。仮引数や戻り値にコロンや矢印で型を書くのがアノテーションで、__annotations__ という辞書に記録されます。ただしアノテーションは記録されるだけで、実行時に型が検査されることはありません。int と書いた仮引数に文字列を渡しても、そのまま動いてしまいます。検査したければ別の道具を使います。
def calc(a, b=10, *rest, **opts):
return (a, b, rest, opts)
print(calc(7)) # (7, 10, (), {})
print(calc(7, 8, 9)) # (7, 8, (9,), {})
print(calc(7, mode='fast')) # (7, 10, (), {'mode': 'fast'})
| 呼び出し | a | b | rest | opts |
|---|---|---|---|---|
| calc(7) | 7 | 10 | () | {} |
| calc(7, 8) | 7 | 8 | () | {} |
| calc(7, 8, 9) | 7 | 8 | (9,) | {} |
| calc(7, mode='fast') | 7 | 10 | () | {'mode': 'fast'} |
| calc(b=8, a=7) | 7 | 8 | () | {} |
| calc(*[7, 8, 9]) | 7 | 8 | (9,) | {} |
| calc(**{'a': 7, 'b': 8}) | 7 | 8 | () | {} |
- 位置引数
- 呼び出し側で書いた順に、定義側の仮引数へ左から順に対応づけられる引数。
- キーワード引数
- 仮引数の名前を指定して渡す引数。順序を入れ替えて書ける。ひとつの呼び出しでは位置引数より後ろに書く。
- デフォルト引数
- 仮引数に等号で既定の値を書いておき、呼び出し側が省略したときに使われるようにしたもの。
- SyntaxError
- 構文の誤りで実行前に検出される例外。デフォルト値を持つ仮引数のうしろに持たない仮引数を置くと発生し、そのファイルは1行も実行されない。
- *args
- 定義側で星1つを付けた仮引数。対応しきれなかった位置引数がタプルとしてまとめて入る。余りが無ければ空のタプル。
- **kwargs
- 定義側で星2つを付けた仮引数。対応しきれなかったキーワード引数が辞書としてまとめて入る。余りが無ければ空の辞書。
- アンパック呼び出し
- 呼び出し側でリストの前に星1つ、辞書の前に星2つを付けて、中身を引数として配る書き方。定義側の星とは働きが逆向き。
- __defaults__
- 関数オブジェクトがデフォルト値を保持している属性。タプルで持たれ、デフォルト値がリストなら中身の変化がそのまま見える。
- ミュータブルなデフォルト引数
- リストや辞書をデフォルト値に書いてしまうこと。1つのオブジェクトが全呼び出しで共有され、前の呼び出しの変更が残る。
- デフォルト値の評価時点
- デフォルト値の式が評価されるのは def を実行したときの1回だけ。呼び出しのたびに評価し直されることはない。
- None を既定にする書き方
- デフォルト値を None にし、本体の先頭で None なら新しい空のリストを作る定石。呼び出しごとに別のオブジェクトになる。
- 戻り値
- return で返す値。return を通らずに終わった関数の戻り値は None になる。
- 複数の戻り値
- return のうしろにカンマ区切りで値を並べると、1つのタプルにまとめられて返る。返っているのはあくまで1つの値。
- lambda
- 名前を持たない小さな関数を式の中で作る書き方。本体には式を1つだけ書く。型は通常の関数と同じ function。
- docstring
- 関数本体の先頭に置いた文字列リテラル。__doc__ 属性から読み出せる説明文になる。
- アノテーション
- 仮引数や戻り値に書く型の注記。__annotations__ に記録されるだけで、実行時に型が検査されることはない。
例題 次の関数を collect('a')、collect('b') の順に呼ぶと、それぞれ何が返るか。また collect.__defaults__ はどうなっているか。 def collect(item, box=[]): box.append(item) return box
1回目の collect('a') は ['a'] を返し、2回目の collect('b') は ['b'] ではなく ['a', 'b'] を返す。そのあと collect.__defaults__ を見ると (['a', 'b'],) になっている。理由は、デフォルト値の [] が def の行を実行したときに1回だけ作られ、その同じリストが関数オブジェクトの __defaults__ に保存されるからである。呼び出しのたびに新しい空リストが作られるわけではないので、append した結果がそのまま次の呼び出しに引き継がれる。避けるには box=None を既定にして、本体の先頭で box が None なら box = [] とする。こうすれば呼び出しごとに別のリストが作られ、呼び出し側が自分のリストを渡したときはそれを使う、という両方が成り立つ。
例題 LIMIT = 100 と書いたあと def cap(n=LIMIT): return n と定義し、続けて LIMIT = 200 に書き換えた。このとき cap() と cap(LIMIT) はそれぞれ何を返すか。
cap() は 100 を返し、cap(LIMIT) は 200 を返す。デフォルト値の式 LIMIT は def の行が実行された瞬間に評価され、そのときの値である 100 が関数オブジェクトに保存される。あとから変数 LIMIT を 200 に書き換えても、保存済みのデフォルト値は書き換わらない。一方 cap(LIMIT) は呼び出しの時点で LIMIT を読むので、そのときの値である 200 が渡る。ミュータブルなデフォルト引数の罠と、この「定義時に1回だけ評価される」性質は、別々の話に見えて同じひとつの規則から出ている。デフォルト値の欄に書いた式は、関数の一部ではなく定義の一部だと考えるとよい。
出典:Python Software Foundation「Python チュートリアル 4. その他の制御フローツール(関数の定義)」Python 3.14 ドキュメント(2026年8月確認)/一般社団法人Pythonエンジニア育成推進協会「Python 3 エンジニア認定基礎試験 出題範囲」(2026年8月確認)
スコープとモジュール
名前が LEGB の順に探されることを理解し、global と nonlocal の使い分け、UnboundLocalError の起こる理由、import と __name__ の仕組み、仮想環境の判定までを押さえます。
プログラムの中に同じ名前の変数が複数あっても混ざらないのは、名前を有効にする範囲が決まっているからです。この範囲をスコープと呼びます。ある名前を読もうとしたとき、Python は決まった順序で入れ物を探します。まず実行中の関数の中(Local)、次に自分を囲んでいる関数の中(Enclosing)、次にモジュールの最上位(Global)、最後に組み込み(Built-in)です。頭文字を取って LEGB と呼びます。見つかった時点で探索は終わるので、内側で同じ名前を使えば外側の名前は隠れます。逆にいえば、内側で定義していない名前は自動的に外側から借りてくることになります。
読むだけなら外側の名前をそのまま使えますが、書き換えようとすると話が変わります。関数の中で名前に代入すると、その名前は新しくローカルな名前として作られ、外側の同名の変数はまったく影響を受けません。外側のモジュール最上位の変数を関数の中から本当に書き換えたいときは、関数の先頭で global 宣言をします。global を書いた名前への代入は、ローカルを作らずにモジュール最上位の変数へ届きます。
書き換えたい相手がモジュール最上位ではなく、ひとつ外側の関数の変数である場合には nonlocal を使います。関数の中に関数を書き、内側から外側の作業用の変数を更新したいときの道具です。global が「いちばん外まで飛ぶ」のに対して、nonlocal は「ひとつ外の関数の枠に届く」と覚えると混同しにくくなります。nonlocal は対応する名前が外側の関数に存在していないと使えず、モジュール最上位の変数を指すこともできません。
ここでつまずきやすいのが UnboundLocalError です。Python は関数の本体をコンパイルする時点で、その関数の中に代入がある名前をすべてローカル変数だと決めてしまいます。判定されるのは関数全体に対してであって、行の順番は関係ありません。したがって、関数の後ろのほうで代入している名前を、その前の行で読もうとすると、外側に同じ名前があってもローカルとして扱われ、まだ値が入っていない状態で読まれることになります。これが UnboundLocalError です。よく出るのは、モジュール最上位のカウンタを関数の中で total = total + 1 のように更新しようとする形で、右辺の total を読む時点でローカル扱いになっているために失敗します。global 宣言を足すか、値を引数で受け取って戻り値で返す形に直します。
スコープの話が済んだら、次はファイル単位のまとまりであるモジュールです。Python のソースファイル1つがそのままモジュール1つで、拡張子を除いたファイル名がモジュール名になります。import mymod と書くと mymod.pub のように前置きを付けて使う形になり、from mymod import hello と書くと名前をそのまま持ち込めます。長い名前は import mymod as mm や from mymod import hello as h のように as で別名を付けられます。どの書き方でも、モジュールの本体が実行されるのは最初の1回だけです。
from mymod import * と書くと、下線で始まらない名前がまとめて持ち込まれます。ただしモジュール側に __all__ という文字列のリストが定義してあれば、持ち込まれるのはそこに挙げた名前だけになります。__all__ は「星印で持ち出してよい名前の一覧」を作者が宣言するための仕組みです。星印による取り込みは、どの名前が入ってきたのかがコードから読み取れなくなり、既存の名前を上書きしてしまうこともあるため、対話環境の外では避けるのが普通です。
モジュールには __name__ という属性があり、import されたときにはモジュール名が入ります。一方、そのファイルを python3 で直接実行したときには、同じ __name__ に '__main__' が入ります。この違いを使うのが if __name__ == '__main__': という書き方です。この下に書いた処理は、直接実行したときだけ動き、他のファイルから import されたときには動きません。動作確認用のコードや、コマンドとして呼ばれたときの入口を、ライブラリとしての中身と同じファイルに同居させるための定番の書き方です。
モジュールを探す場所は sys.path というリストに並んでいます。ただのリストなので実行中に追加することもできますが、置き場所を工夫するほうが健全です。一度読み込んだモジュールは sys.modules という辞書にキャッシュされ、同じモジュールを二度 import してもファイルは読み直されません。二度目の import は、キャッシュされている同じモジュールオブジェクトを結び付け直すだけです。コマンドラインから渡された値は sys.argv というリストで受け取り、その先頭にはスクリプト名そのものが入ります。したがって引数を2つ渡したときの sys.argv の長さは3になります。
最後に仮想環境です。python3 -m venv でプロジェクトごとの独立した環境を作ると、その中の pip でインストールしたパッケージは他のプロジェクトに影響しません。いま自分が仮想環境の中で動いているかどうかは、sys.prefix と sys.base_prefix を見比べれば分かります。仮想環境の中では sys.prefix がその環境のディレクトリを指し、sys.base_prefix は元になった Python のディレクトリを指すため、2つは食い違います。仮想環境の外では両方が同じ値になります。pip の版やインストール先の具体的な文字列は環境ごとに違うので、覚えるのはこの食い違いの有無だけで十分です。
BASE = 'module'
def show():
BASE = 'function'
def deeper():
return BASE # Enclosing を読む
return deeper()
print(show()) # function
print(BASE) # module
| 段 | 指す範囲 | 代入に必要な宣言 |
|---|---|---|
| Local | いま実行中の関数の中 | 不要(代入すればローカルが作られる) |
| Enclosing | 自分を囲んでいる外側の関数の中 | nonlocal |
| Global | モジュールの最上位 | global |
| Built-in | len や print などの組み込み | 代入すると同名のグローバルが作られる |
- スコープ
- 名前が有効になる範囲。同じ名前が別の場所にあっても混ざらないのはスコープが分かれているため。
- LEGB
- 名前を探す順序。Local、Enclosing、Global、Built-in の頭文字。見つかった時点で探索は終わる。
- Enclosing
- 自分を囲んでいる外側の関数のスコープ。関数の中に関数を書いたときにだけ現れる段。
- global
- 関数の中からモジュール最上位の変数へ代入するための宣言。書かずに代入すると新しいローカル変数ができる。
- nonlocal
- 内側の関数から、ひとつ外側の関数の変数へ代入するための宣言。モジュール最上位の変数は指せない。
- UnboundLocalError
- 関数の中に代入がある名前を、値が入る前に読んだときに起こる例外。代入が後ろの行にあっても関数全体でローカル扱いになる。
- モジュール
- Python のソースファイル1つ分のまとまり。拡張子を除いたファイル名がそのままモジュール名になる。
- import
- モジュールを読み込む文。import mymod なら前置き付きで使い、from mymod import hello なら名前をそのまま持ち込む。
- as
- import した名前に別名を付ける書き方。import mymod as mm や from mymod import hello as h のように使う。
- from ... import *
- 下線で始まらない名前をまとめて持ち込む書き方。どの名前が入ったか読み取れなくなるため通常は避ける。
- __all__
- モジュール側に置く文字列のリスト。星印による取り込みで持ち出される名前を、この一覧に限定できる。
- __name__
- モジュールが持つ属性。import されたときはモジュール名、直接実行したときは '__main__' が入る。
- if __name__ == '__main__':
- 直接実行したときだけ動かしたい処理を置く定番の書き方。import されたときは実行されない。
- sys.path
- モジュールを探すディレクトリを並べたリスト。実行中に要素を追加することもできる。
- sys.modules
- 読み込み済みモジュールのキャッシュ辞書。同じモジュールを二度 import してもファイルは読み直されない。
- sys.argv
- コマンドラインから渡された値のリスト。先頭にスクリプト名が入るので、引数2つなら長さは3になる。
- venv
- プロジェクトごとに独立した Python 環境を作る標準の仕組み。python3 -m venv で作成する。
- sys.prefix と sys.base_prefix
- 仮想環境の中では両者が食い違い、外では一致する。仮想環境で動いているかの判定に使える。
例題 モジュール最上位に total = 0 があるとき、次の関数を呼ぶと何が起こるか。直すにはどうすればよいか。 def bump(): total = total + 1
UnboundLocalError となり、cannot access local variable 'total' where it is not associated with a value というメッセージが出る。関数の中に total への代入があるため、Python はコンパイルの時点で total をこの関数のローカル変数だと決めてしまう。すると右辺の total を読む段階で、まだ値の入っていないローカル変数を読むことになり、最上位の total = 0 は参照されない。直し方は2つある。ひとつは関数の先頭に global total と書いて、最上位の変数を書き換える意思を明示すること。もうひとつは def bump(total): return total + 1 のように値を引数で受け取り、戻り値で返して呼び出し側で代入することで、こちらのほうが副作用が無く読みやすい。
例題 geo.py の先頭に __all__ = ['area', 'PI'] と宣言し、PI と UNIT と area() と _round2() を定義してある。別のファイルで from geo import * と書いたとき、使えるようになる名前はどれか。
使えるようになるのは area と PI の2つだけで、UNIT も _round2 も入ってこない。星印による取り込みは、通常なら下線で始まらない名前をすべて持ち込むが、モジュール側に __all__ があるときはその一覧に挙がっている名前だけに絞られる。UNIT は下線で始まっていないが __all__ に無いので入らず、_round2 は下線で始まっているうえに __all__ にも無いので二重に入らない。関数か変数かで扱いが変わることはなく、area が入って PI が入らないといったこともない。UNIT を使いたければ from geo import UNIT のように名前を指定するか、import geo として geo.UNIT と書けばよい。__all__ が効くのは星印による取り込みのときだけで、名前を指定した取り込みや前置き付きのアクセスを禁止するものではない。
出典:Python Software Foundation「Python チュートリアル 9. クラス(Python のスコープと名前空間)」Python 3.14 ドキュメント(2026年8月確認)/Python Software Foundation「Python チュートリアル 6. モジュール」Python 3.14 ドキュメント(2026年8月確認)/Python Software Foundation「Python チュートリアル 12. 仮想環境とパッケージ」Python 3.14 ドキュメント(2026年8月確認)
ファイルの読み書きとJSON
open のモードの違い、with 文が保証すること、read と readlines と for 文の読み分け、そして json での往復で型がどう変わるかを、実行結果とともに押さえます。
ファイルを扱うときは、まず open でファイルオブジェクトを作ります。第1引数がパス、第2引数がモードで、モードを省略すると読み込み専用の 'r' になります。'r' は既存のファイルを読むためのもので、ファイルが無ければ FileNotFoundError になります。'w' は書き込み用で、同じ名前のファイルがあれば中身を切り詰めて空にしてから書き始めます。'a' も書き込み用ですが、既存の内容は残し、末尾に付け足します。'x' は新規作成専用で、すでに同名のファイルがあると FileExistsError になります。読み書きの両方をしたいときは 'r+' を使い、文字列ではなくバイト列として扱いたいときは 'rb' や 'wb' のように b を添えます。
書き込み用に開いたファイルから読もうとしたり、読み込み用に開いたファイルへ書こうとしたりすると、io.UnsupportedOperation という例外になります。メッセージはそれぞれ not readable、not writable です。文法として通ってしまう書き方なので、開くときのモードを取り違えたことに気づくのは実行してからになります。逆にいえば、モードは「そのファイルオブジェクトに何を許すか」を宣言している場所だといえます。
開いたファイルは必ず閉じなければなりません。閉じ忘れを防ぐ標準の書き方が with 文です。with のブロックを抜けるときにファイルは自動的に閉じられ、閉じたかどうかは closed 属性で確かめられます。ブロックの中で例外が発生して途中で抜けた場合でも、閉じる処理は必ず実行されます。カンマで区切れば複数のファイルを1つの with 文でまとめて開くこともでき、その場合はどれも同じように閉じられます。閉じたあとのファイルオブジェクトを読もうとすると ValueError となり、I/O operation on closed file. と知らされます。
読み方には使い分けがあります。read は残り全部を1つの文字列として返します。ファイルオブジェクトは現在位置を覚えているので、読み切ったあとにもう一度 read を呼ぶと、位置が末尾にあるため空文字列が返ります。何も表示されないのを見て「読み込みに失敗した」と誤解しやすい場面です。readline は1行だけを返し、readlines は全行をリストにして返します。どちらの場合も行末の改行文字はそのまま残ることに注意してください。改行を落としたければ rstrip を使います。
ファイルオブジェクトはそれ自体が反復可能なので、for line in f と書けば1行ずつ取り出せます。この書き方は全体をメモリに読み込まないので、大きなファイルでも安全です。行の内容は readlines のときと同じく改行付きで渡ってきます。行を集めたリストが本当に必要な場合を除けば、for 文で回すほうが素直です。
書き込みは write で行います。write は書き込んだ文字数を戻り値として返すので、代入して受け取ると長さが分かります。改行は自動では付かないので、行を区切りたいときは自分で改行文字を書きます。print も file 引数を渡せばファイルへ出力でき、こちらは末尾に改行が付きます。現在位置は tell で取得でき、seek で移動できます。seek(0) で先頭に戻せば、もう一度最初から読み直せます。
プログラムの中のデータをそのままファイルに残したいときは json が便利です。json.dumps は Python のオブジェクトを JSON の文字列にし、json.loads は JSON の文字列を Python のオブジェクトに戻します。ファイルを相手にするときは json.dump と json.load を使います。対応関係はおおむね素直で、辞書はオブジェクト、リストは配列、True は true、None は null になります。
ただし往復で型が変わる場面があるので注意が必要です。タプルは JSON の配列に変換されますが、読み戻したときはリストになります。JSON に配列とタプルの区別が無いため、元がどちらだったかという情報は残りません。辞書のキーも同じで、整数をキーにした辞書を dumps すると、キーは文字列に変換されます。読み戻したときのキーは文字列のままで、整数には戻りません。集合はそもそも JSON に対応する型が無く、dumps しようとすると TypeError となり、Object of type set is not JSON serializable と知らされます。集合を残したいときは、あらかじめリストへ変換しておきます。
文字の扱いにも既定があります。json.dumps は ensure_ascii の既定値が真になっているため、日本語などの非 ASCII 文字はエスケープされた形で出力されます。これは JSON として正しく、読み戻せば元の文字に戻りますが、人が目で読むファイルとしては扱いにくくなります。ensure_ascii に偽を渡せば、日本語をそのままの文字で出力できます。indent を渡せば字下げ付きで整形され、sort_keys を渡せばキーを並べ替えて出力できます。
path = '/tmp/memo.txt'
with open(path, 'w') as f:
f.write("alpha\nbeta\n") # 戻り値は 11
with open(path) as f:
for line in f:
print(repr(line)) # 'alpha\n' のあと 'beta\n'
| モード | 対象ファイルが無いとき | 読み | 書き |
|---|---|---|---|
| 'r'(既定) | FileNotFoundError | 可 | 不可 |
| 'w' | 新しく作られる | 不可 | 可(既存の内容は切り詰め) |
| 'a' | 新しく作られる | 不可 | 可(末尾に追記) |
| 'x' | 新しく作られる | 不可 | 可(既にあると FileExistsError) |
| 'r+' | FileNotFoundError | 可 | 可 |
| 'rb' | FileNotFoundError | 可(bytes) | 不可 |
- open
- ファイルオブジェクトを作る組み込み関数。第2引数のモードを省略すると読み込み専用の 'r' になる。
- モード 'r'
- 読み込み専用。ファイルが無ければ FileNotFoundError になる。書き込もうとすると io.UnsupportedOperation。
- モード 'w'
- 書き込み用。同名のファイルがあれば中身を切り詰めて空にしてから書き始める。
- モード 'a'
- 書き込み用。既存の内容を残したまま、末尾に付け足す。
- モード 'r+'
- 読み書きの両方ができるモード。対象のファイルは存在している必要がある。
- モード 'rb'
- バイト列として読むモード。read の戻り値は str ではなく bytes になる。
- io.UnsupportedOperation
- モードで許されていない操作をしたときの例外。not readable や not writable というメッセージが付く。
- with 文
- ブロックを抜けるときに必ず後始末を行う構文。例外で抜けた場合もファイルは閉じられる。カンマ区切りで複数まとめられる。
- closed
- ファイルオブジェクトが閉じられているかを表す属性。with を抜けたあとは真になる。
- read
- 現在位置から残り全部を1つの文字列として返す。読み切ったあとに再度呼ぶと空文字列が返る。
- readline
- 1行だけを返す。行末の改行文字は残る。
- readlines
- 全行をリストにして返す。各要素の行末には改行文字が残る。
- write
- 文字列を書き込み、書き込んだ文字数を戻り値として返す。改行は自動では付かない。
- seek と tell
- tell は現在位置を返し、seek は位置を移動する。seek(0) で先頭に戻せる。
- json.dumps と json.loads
- Python のオブジェクトを JSON 文字列にするのが dumps、JSON 文字列を Python に戻すのが loads。
- タプルの往復
- タプルは JSON の配列になり、読み戻すとリストになる。タプルには戻らない。
- キーの文字列化
- 辞書のキーは JSON では文字列になる。整数キーは dumps で文字列になり、読み戻しても整数には戻らない。
- ensure_ascii
- json.dumps の引数。既定は真で非 ASCII 文字をエスケープする。偽にすると日本語がそのままの文字で出力される。
例題 同じファイルに対して、'w' で first を書き、続けて 'w' で second を書き、最後に 'a' で third を書いた。読み出すと何が入っているか。
secondthird が入っている。'w' で開くと、その時点で既存の内容の有無に関わらずファイルは長さ0に切り詰められるからである。順に追うと、最初の 'w' で first が入り、2回目の 'w' で開いた瞬間に first が消えてそこへ second が書かれる。最後の 'a' は追記なので second を残したまま末尾に third が足され、secondthird になる。切り詰めが起きるのは開いた瞬間であって書き込んだ瞬間ではないので、'w' で開いただけで何も書かずに閉じればファイルは空になる。追記したいのに 'w' で開いてしまい、前回の実行結果が毎回消えるというのはよくある事故である。書き足すつもりなら 'a'、作り直すつもりなら 'w' と、意図をモードで表明する。なお 'w' も 'a' も読み込みは許されないので、書いた直後に同じオブジェクトから読み返すことはできない。
例題 d = {'name': '蒼山', 'tags': ('x', 'y')} を json.dumps したあと json.loads で読み戻すと、tags の型は何になるか。また日本語をそのままの文字で出力するにはどうするか。
tags はリストになる。JSON には配列しか無くタプルという型が存在しないため、dumps の時点でタプルは配列に変換され、loads で読み戻すときも配列はリストとして復元される。元がタプルだったという情報はどこにも残らないので、往復させると型が変わってしまう。タプルのまま扱いたければ、読み戻したあとに自分で tuple() を適用する必要がある。日本語については、json.dumps の ensure_ascii の既定値が真なので、そのままでは蒼山がエスケープされた形で出力される。ensure_ascii に偽を渡せば、日本語がそのままの文字で書き出される。読み戻した結果はどちらでも同じ文字列になる。
出典:Python Software Foundation「Python チュートリアル 7. 入力と出力」Python 3.14 ドキュメント(2026年8月確認)/Python Software Foundation「Python 標準ライブラリ json --- JSON エンコーダーとデコーダー」Python 3.14 ドキュメント(2026年8月確認)
例外とクラスと標準ライブラリ
例外 tryとexceptと例外の階層
try except else finally がどの順に走るのか、例外はどんな親子関係で並んでいるのか、raise と assert は何をするのか。8章は出題40問中4問(10%)の重い章です。
プログラムが止まる止まり方には2種類あります。1つは構文エラーで、書き方そのものが Python の文法に合っていないもの。これは実行される前に弾かれます。もう1つが例外で、書き方は正しいのに実行してみたら実行できなかったもの。0で割った、無い鍵で辞書を引いた、数字でない文字列を int() に渡した。例外処理はこの後者を扱う仕組みです。
基本の形は try と except です。try のブロックを上から実行し、途中で例外が起きたらそこで中断して、種類が合う except に飛びます。合う except が1つも無ければ、その例外は呼び出し元へ伝わっていき、最後まで誰も受け止めなければプログラムが止まります。except のうしろに as e と書くと、飛んできた例外オブジェクトそのものを受け取れます。e.args に raise へ渡された引数がタプルで入り、str(e) でメッセージが読めます。
ここに else と finally が加わります。else は try で例外が起きなかったときだけ実行されるブロックです。名前が紛らわしいのですが、if の else とは逆で「うまくいったとき」の側です。finally は例外が起きても起きなくても必ず実行されるブロックで、ファイルを閉じるような後片付けを置く場所です。実行順は、例外が無ければ try、else、finally。例外があって捕まえたなら try の途中まで、except、finally。この2本の道筋を頭に入れておけば、出力を並べる問題はほぼ解けます。
finally の性質でいちばん問われるのが return との関係です。try の中に return があっても、finally は return より前に実行されます。値を返す準備ができてから、いったん finally に寄って、それから返るのだと考えてください。そして finally の中にも return があると、そちらが戻り値を上書きしてしまいます。try で return したはずの値が消えるので、finally に return を書くのは避けるのが定石です。
例外にはクラスの親子関係があります。頂点は BaseException で、その直下に Exception があり、普段使う例外のほとんどは Exception の下にぶら下がっています。except Exception と書けば、その下の子孫はまとめて捕まえられます。逆にいうと、Exception の下にいない KeyboardInterrupt と SystemExit は except Exception では捕まりません。この2つは BaseException の直下にいて、利用者が Ctrl-C で止めたときやプログラムが自分で終了するときのものなので、うっかり握りつぶさないよう別枠にしてあるのです。
中間の親も覚える価値があります。IndexError と KeyError はどちらも LookupError の下です。添字でも鍵でも「引いたが見つからない」という同じ性質なので、まとめて except LookupError で受けられます。ZeroDivisionError は ArithmeticError の下、FileNotFoundError は OSError の下、ModuleNotFoundError は ImportError の下です。親クラスを書けば子も捕まるので、except を並べるときは必ず狭いもの(子)を先、広いもの(親)を後に書きます。順序を逆にすると、先に書いた親がすべて拾ってしまい、後ろの except は永遠に出番が来ません。複数をまとめたいときは except (ValueError, TypeError) のようにタプルで並べます。丸括弧を忘れるとエラーになります。
自分で例外を起こすのが raise です。raise ValueError('負の数は不可') のようにインスタンスを渡します。except の中で引数を付けずに raise とだけ書くと、いま処理中の例外をそのまま呼び出し元へ投げ直します。ログだけ残して判断は上に任せたい、というときの書き方です。独自の例外を作るときは class LoadError(Exception): pass のように Exception を継承したクラスを定義するだけでよく、中身が空でも例外として使えます。Exception を継承しておけば except Exception でも拾えるようになります。
assert は「ここでは必ずこうなっているはず」を書き残す文です。assert 条件, メッセージ と書き、条件が偽なら AssertionError が上がります。ただし python3 -O のように最適化モードで実行すると assert は丸ごと無効化され、1行も実行されません。したがって assert を入力値の検証に使ってはいけません。利用者が入れた値をはねるのは if と raise の仕事で、assert は開発時の自己点検に使うものだ、と役割を分けて覚えてください。
else と finally の通り道を確かめる。出力は 変換できました/後片付け/30/数字ではありません/後片付け/-1 の順
def read_age(s):
try:
n = int(s)
except ValueError:
print("数字ではありません")
return -1
else:
print("変換できました")
return n
finally:
print("後片付け")
print(read_age("30"))
print(read_age("x"))
| 例外 | 上がる場面 | 直近の親 |
|---|---|---|
| ZeroDivisionError | 0 で割った | ArithmeticError |
| ValueError | 型は合うが値が不適切(int('abc')) | Exception |
| TypeError | 型が合わない('a'+1、len(5)) | Exception |
| IndexError | 並びの範囲外の添字 | LookupError |
| KeyError | 辞書に無い鍵 | LookupError |
| NameError | 定義していない名前を使った | Exception |
| FileNotFoundError | 無いファイルを開いた | OSError |
| ModuleNotFoundError | 無いモジュールを import した | ImportError |
| KeyboardInterrupt | 利用者が Ctrl-C で止めた | BaseException |
- 例外
- 文法としては正しいのに、実行してみると続行できなかったときに送出されるオブジェクト。構文エラーは実行前に弾かれるので別物。
- else 節
- try で例外が起きなかったときだけ実行される。if の else とは向きが逆で、成功した側に付く。
- finally 節
- 例外の有無にかかわらず必ず実行される。try に return があっても finally が先に走り、finally に return があると戻り値を上書きする。
- BaseException
- 例外階層の頂点。直下に Exception のほか KeyboardInterrupt と SystemExit がいる。この2つは except Exception では捕まらない。
- LookupError
- IndexError と KeyError の共通の親。添字でも鍵でも「引いたが見つからない」場面をまとめて受けられる。
- ArithmeticError
- ZeroDivisionError や OverflowError の親。except ArithmeticError と書けば 0 除算も捕まる。
- except のタプル指定
- except (ValueError, TypeError) as e のように丸括弧で並べると、どれか1つに一致したときに実行される。
- 引数なしの raise
- except の中で raise とだけ書くと、いま処理中の例外をそのまま呼び出し元へ再送出する。
- 自作例外
- Exception を継承したクラスを定義するだけで作れる。中身が pass だけでも例外として送出でき、except Exception でも拾える。
- assert
- 条件が偽なら AssertionError を送出する文。python3 -O では無効化されるので、入力値の検証には使わない。
例題 例題:except Exception と書いておけば、実行中に起きうる異常はすべて受け止められると考えてよいか。
いいえ。Exception の下にぶら下がっている例外だけです。KeyboardInterrupt と SystemExit は BaseException の直下にいるので、except Exception では捕まりません。これは仕様上そうしてあるもので、利用者が Ctrl-C で止めようとしたのに握りつぶされて止まらない、といった事故を防いでいます。本当にすべてを受けたいときだけ except BaseException と書きますが、止められないプログラムになりがちなので普段は使いません。
例題 例題:except を2つ並べたのに、後ろの except が一度も実行されない。何を疑うか。
並び順です。except は上から順に照合し、最初に一致したところで打ち切ります。先に親クラスを書いてしまうと、その子孫はすべて親のほうで拾われ、後ろに書いた子クラスの except には出番が来ません。ArithmeticError を先、ZeroDivisionError を後に書いた場合がまさにこれです。狭いものを先、広いものを後、という順に並べ替えてください。
例題 例題:入力欄に負の数が入っていないかを assert で確かめている。この設計の何が危ういか。
本番を python3 -O で動かすと assert が丸ごと無効になり、検査が消えてしまうことです。assert は開発中の自己点検のための文で、実行時に必ず効く保証がありません。利用者の入力をはねるなら if で条件を見て raise ValueError(...) を投げる形にします。assert は「ここに来る時点で計算済みのはず」といった、内部の前提を書き残す用途に限るのが安全です。
出典:Python Software Foundation「Python チュートリアル 8. エラーと例外」Python 3.14 ドキュメント(2026年8月確認)
クラス 継承とMROと特殊メソッド
self とは何か、クラス変数とインスタンス変数はどこが違うのか、多重継承のときどの親が選ばれるのか。9章は2問ですが、クラス変数の共有と MRO は取りこぼしやすい論点です。
クラスは、データとそれを扱う手続きをひとまとめにした型の設計図です。class Dog: と書いて中にメソッドを並べ、Dog("Rex") と呼ぶとインスタンスが1つ作られます。作られる途中で自動的に呼ばれるのが __init__ で、ここでそのインスタンス固有のデータを self に持たせます。__init__ は「初期化するメソッド」であって、インスタンスそのものを作って返すメソッドではありません。
メソッドの第1引数 self は、呼び出したインスタンス自身が自動的に入る場所です。d.speak() と書くと Python が裏で Dog.speak(d) に読み替えています。ですから self という名前自体は決まりごとではなく単なる慣習で、第1引数が自分自身を受けるという位置だけが仕様です。逆に Dog.speak(d) と自分で書いても同じように動きます。
つまずきどころの筆頭がクラス変数とインスタンス変数の違いです。class の直下に書いた変数はクラス変数で、そのクラスから作られた全インスタンスが同じ1つを共有します。__init__ の中で self.名前 = 値 と書いたものはインスタンス変数で、インスタンスごとに別々に持ちます。Dog.kind = "wolf" とクラス側を書き換えると、すべてのインスタンスから見える値が変わります。一方 d.kind = "husky" とインスタンス側に代入すると、そのインスタンスの __dict__ に kind が新しく作られ、クラス変数の上に影を落とします。以後 d.kind はその影を返し、ほかのインスタンスとクラス変数は元のままです。
この違いが牙をむくのが、リストや辞書のようなミュータブルなオブジェクトをクラス変数にしたときです。class Basket: items = [] と書いて self.items.append(x) とすると、self.items は代入ではなく参照なので、たどり着く先はクラス変数の1つのリストです。結果として、どのインスタンスから足しても全員の items が同じ内容になります。インスタンスごとに別々の入れ物が欲しければ、__init__ の中で self.items = [] と代入して作ってください。self.count += 1 のように数値のクラス変数を増やそうとしたときも同じ理屈が働きますが、こちらは += が代入なので、クラス変数は 0 のまま、インスタンス側に 1 という影ができます。
継承は class Cat(Animal): のように親クラスを書きます。子で同じ名前のメソッドを定義すれば上書き(オーバーライド)になり、親の実装も呼びたいときは super() を使います。子の __init__ の中で super().__init__(name) と呼ぶのが定番で、親が用意していた初期化をやってから、子だけの属性を足すという流れになります。super() を書き忘れると親の __init__ が走らないので、親が用意するはずだった属性が存在しないインスタンスができあがります。
親を2つ以上書けるのが多重継承です。このとき、どの親のメソッドが使われるかを決める並びが MRO(メソッド解決順序)で、クラス.__mro__ で確認できます。並びは C3線形化という規則で作られ、単純な深さ優先ではありません。A を親に持つ B と C があり class D(B, C) とすると、MRO は D、B、C、A、object です。B から A へ潜ってしまわず、いったん C を見てから A に行く点が肝で、これは共通の親 A を子より先に置かないという規則によります。class E(C, B) と書けば E、C、B、A、object になり、先に書いたほうが優先されます。矛盾する順序を要求すると、そもそもクラス定義の時点で TypeError になります。B が A を継承しているのに class F(A, B) と書くと、A を B より先にしたいという指定と、親は子より後という規則がぶつかるためです。
属性を外から触られたくないときは名前の先頭にアンダースコアを付けます。_x のように1本だけ付けるのは「内部用のつもりです」という慣習の合図にすぎず、外から普通に読み書きできます。__x のように2本付けると名前修飾(ネームマングリング)が働き、実際の属性名が _クラス名__x に書き換えられます。そのため p.__x と書くと AttributeError になりますが、p._P__x と書けば読めます。本来の目的は、継承したときに親子で属性名がぶつかるのを防ぐことで、アクセス制限そのものではありません。Python に private キーワードはありません。
先頭と末尾にアンダースコアが2本ずつ付く名前は特殊メソッドで、組み込みの構文や関数から呼ばれます。print(v) や str(v) は __str__、repr(v) とリストや辞書の中に入れて表示したときは __repr__ が使われます。__str__ が無ければ __repr__ で代用されますが、逆はありません。len(v) は __len__、v + w は __add__、v == w は __eq__ です。ここで1つ落とし穴があり、__eq__ を定義したクラスは __hash__ が自動的に None にされます。等しさの定義を変えたのにハッシュ値が元のままだと集合や辞書が壊れるためで、その結果 set に入れようとすると unhashable type というエラーになります。ハッシュも使いたいなら __hash__ も自分で定義してください。
n はインスタンスごと、total はクラス全体。出力は left:2 right:1 3。総数を数えたいときは Counter.total と明示して増やす
class Counter:
total = 0
def __init__(self, label):
self.label = label
self.n = 0
def tick(self):
self.n += 1
Counter.total += 1
def __str__(self):
return "{}:{}".format(self.label, self.n)
a = Counter("left")
b = Counter("right")
a.tick()
a.tick()
b.tick()
print(a, b, Counter.total)
| 操作 | そのインスタンス | ほかのインスタンス | クラス側 |
|---|---|---|---|
| クラス変数に代入(Dog.kind = 'wolf') | 変わる | 変わる | 変わる |
| インスタンスに代入(d.kind = 'husky') | 変わる | 元のまま | 元のまま |
| ミュータブルなクラス変数を変更(self.items.append(x)) | 変わる | 変わる | 変わる |
| __init__ で作ったリストを変更(self.items.append(x)) | 変わる | 元のまま | そもそも持たない |
- __init__
- インスタンスが作られた直後に自動で呼ばれる初期化のメソッド。インスタンスを生成して返すものではない。
- self
- メソッドの第1引数に自動で渡される、呼び出したインスタンス自身。名前は慣習で、位置だけが仕様。
- クラス変数
- class の直下に書いた変数。全インスタンスで1つを共有する。クラス側を書き換えると全員に波及する。
- インスタンス変数
- self.名前 = 値 で作る、インスタンスごとに別々の変数。同名のクラス変数があれば、その上に影を落とす。
- super()
- MRO 上で次に来るクラスを参照する。子の __init__ から super().__init__(...) と呼んで親の初期化を行うのが定番。
- MRO
- メソッド解決順序。C3線形化で決まり、クラス.__mro__ で確認できる。class D(B, C) なら D、B、C、A、object。
- 名前修飾
- __x のようにアンダースコア2本で始まる属性名が _クラス名__x に書き換えられる仕組み。継承時の名前衝突を防ぐためのもの。
- __str__ と __repr__
- 前者は print() や str() が使う読みやすい表現、後者は repr() やコンテナの中で使われる表現。__str__ が無ければ __repr__ で代用される。
- __eq__
- == の振る舞いを決める特殊メソッド。定義すると __hash__ が None になり、そのままでは集合や辞書のキーに使えなくなる。
- 特殊メソッド
- 前後にアンダースコアが2本ずつ付く名前。__len__ は len()、__add__ は + など、組み込みの構文から呼ばれる。
例題 例題:クラスの中に設定用の辞書を1つ置いておきたい。class 直下に書くか、__init__ の中で作るか、どう決めるか。
全インスタンスで同じ1つを共有してよいなら class 直下(クラス変数)、インスタンスごとに別々に持たせたいなら __init__ の中で self に代入します。判断を誤ると、片方のインスタンスで設定を書き換えたつもりが全員に反映されてしまいます。共有したい定数のうち、書き換えないもの(文字列や数値)なら class 直下でもほぼ困りませんが、辞書やリストのように中身を書き換えるものは、共有してよいかを必ず先に決めてください。
例題 例題:class Sub(Base) を書いて Sub("名前") としたら、Base が用意するはずの属性が無いと言われた。何を忘れているか。
子の __init__ の中で super().__init__("名前") を呼び忘れています。子が __init__ を定義した時点で親の __init__ は上書きされ、自動では走りません。親が self に持たせるはずだった属性が作られないまま、そのインスタンスが出来上がります。子で __init__ を定義するなら、原則として最初に super().__init__(...) を呼ぶ、と覚えておくと安全です。
例題 例題:自作クラスを集合に入れたら unhashable type だと言われた。心当たりは。
そのクラスで __eq__ を定義したはずです。__eq__ を定義すると __hash__ が自動的に None にされ、ハッシュを必要とする集合や辞書のキーに使えなくなります。等しさの定義を変えたのにハッシュ値が古いままだと、等しい2つが別の場所に入ってしまうためです。集合に入れたいなら、等しいときに同じ値を返す __hash__ を自分で定義します。値を変えないクラスなら、属性をタプルにまとめて hash() に渡す書き方が簡単です。
出典:Python Software Foundation「Python チュートリアル 9. クラス」Python 3.14 ドキュメント(2026年8月確認)
標準ライブラリとイテレータ
math random datetime os.path sys re json collections。そしてイテレータとジェネレータ、map filter reduce、any all、is と ==。10章4問と11章1問ぶんの守備範囲です。
Python には最初から大量のモジュールが同梱されていて、import するだけで使えます。試験で顔を出すのは決まった顔ぶれなので、それぞれ何をする道具かと、返ってくる値の型を押さえておけば足ります。とくに「int が返るのか float が返るのか」「リストが返るのかイテレータが返るのか」を取り違える問題がよく出ます。
math は数学の関数です。math.pi は円周率、math.sqrt(16) は 4.0 で、割り切れても float が返る点に注意します。math.floor は下方向への切り捨てなので math.floor(-1.5) は -2、math.ceil は上方向なので math.ceil(-1.5) は -1 です。0 方向に丸める int(-1.5) が -1 になるのと結果が食い違うので、負の数で必ず確かめてください。random は乱数で、random.random() は 0.0 以上 1.0 未満の float、random.randint(1, 10) は両端を含む整数、random.choice(並び) は要素を1つ選びます。random.seed(値) を先に呼ぶと同じ並びが再現できます。
datetime は日付と時刻です。datetime.date(2026, 8, 22) で日付を作り、strftime('%Y/%m/%d') で書式を指定した文字列にします。日付どうしの引き算は timedelta を返し、日付に timedelta(days=10) を足すと10日後の日付になります。os.path はパスの文字列を組み立てたり分解したりする道具で、os.path.join('a', 'b') は区切り文字を補って 'a/b'、os.path.basename('/x/y/z.txt') は 'z.txt'、os.path.dirname は '/x/y' です。os.path.splitext('z.txt') は ('z', '.txt') のように拡張子だけを、点を付けたまま切り離したタプルを返します。sys はインタプリタ自身の情報で、sys.argv がコマンドライン引数のリスト、sys.path がモジュールを探すディレクトリのリスト、sys.version_info がバージョンです。
re は正規表現です。いちばん問われるのが re.match と re.search の違いで、match は文字列の先頭からしか照合しません。re.match('b', 'abc') は一致せず None を返しますが、re.search('b', 'abc') は途中でも探すので一致します。どちらも見つかればマッチオブジェクトを返し、.group() で一致した文字列、.groups() で丸括弧のグループをタプルで取り出せます。re.findall はすべての一致を文字列のリストで返し、re.sub は置換した文字列、re.split は分割したリストを返します。パターンには r'\d+' のような raw 文字列を使うのが習慣です。
json は Python のオブジェクトと JSON 文字列の相互変換です。json.dumps がオブジェクトから文字列へ、json.loads が文字列からオブジェクトへ。往復すると型が変わることがあるのが要点で、タプルは JSON の配列になり、戻すとリストになります。タプルには戻りません。辞書のキーは文字列化されるので、{1: 'a'} は '{"1": "a"}' になります。集合は JSON に対応する型が無いので json.dumps({1, 2}) は TypeError です。日本語は既定で \\uXXXX にエスケープされ、そのまま出したいときは ensure_ascii=False を渡します。
collections は用途を絞った入れ物の詰め合わせです。Counter は要素を数える辞書で、Counter('abracadabra') のように渡すと各文字の個数が入り、most_common(2) で多い順に2件のタプルのリストが返ります。無いキーを引いても KeyError にならず 0 が返ります。defaultdict(list) は未知のキーを引いた瞬間に空リストを作るので、いきなり append できます。namedtuple('Pt', 'x y') は名前でも添字でも読めるタプルを作り、isinstance(p, tuple) は True です。つまりタプルの一種であって、値を書き換えることはできません。deque は両端に高速に出し入れできる並びで、appendleft と popleft が使えます。
イテレータは、next() を呼ぶたびに次の値を1つ返し、尽きると StopIteration を送出するオブジェクトです。for 文は裏でこれを回しています。ここで最大のつまずきどころは、map filter zip enumerate と、あとで述べるジェネレータが、いずれもリストではなくイテレータを返すことです。イテレータは一度きりで、list() で取り出すと中身が空になります。同じ map オブジェクトに2回 list() をかけると、2回目は空リストになります。使い回したいなら、最初に list() でリストに固めてください。
ジェネレータは yield を含む関数から作られるイテレータです。ふつうの関数と決定的に違うのは、呼んだ時点では本体が1行も実行されないことです。返ってくるのはジェネレータオブジェクトだけで、最初の next() でようやく先頭から動きだし、yield に当たるとそこで止まって値を返します。次の next() で止まった続きから再開し、関数が終わると StopIteration になります。すべてをメモリに載せずに済むので、巨大な並びや無限の並びを扱えます。丸括弧で書く内包表記 (i*i for i in range(3)) はジェネレータ式で、角括弧のリスト内包表記とは返る型が違います。
map(関数, 並び) は各要素に関数を適用したイテレータ、filter(関数, 並び) は関数が真を返した要素だけのイテレータです。filter の第1引数に None を渡すと、要素そのものの真偽で絞り込み、0 や空文字列や None といった偽の要素が落ちます。functools.reduce(関数, 並び) は左から2つずつ畳み込んで1つの値にします。any は1つでも真なら True、all は全部真なら True ですが、空の並びを渡したときが逆転します。all([]) は True、any([]) は False です。「反例が1つも無いから真」「例が1つも無いから偽」と読むと筋が通ります。
最後に is と == です。== は値が等しいかを尋ね、is は同じオブジェクトかを尋ねます。a = [1, 2] と b = [1, 2] は a == b が True でも a is b は False で、中身が同じだけの別のリストだからです。c = a と代入した場合だけ c is a が True になります。None は1つしか存在しない特別なオブジェクトなので、x is None と書くのが作法です。整数や文字列で is を試すと、処理系のキャッシュ次第で結果が変わることがあるため、値を比べたいときは常に == を使ってください。
出力は 4 24 / data/log.csv / [('i', 4)] / [5, 3, 4] / ['apple', 'kiwi']。map と filter は list() で包まないと中身が見えない
import math
import os.path
from collections import Counter
print(math.ceil(3.2), math.factorial(4))
print(os.path.join("data", "log.csv"))
print(Counter("mississippi").most_common(1))
words = ["apple", "fig", "kiwi"]
print(list(map(len, words)))
print(list(filter(lambda w: len(w) > 3, words)))
| 書いたもの | 返るもの | 取り違えやすい答え |
|---|---|---|
| math.sqrt(16) | 4.0(float) | 4(int)と思いがち |
| math.floor(-1.5) | -2(下方向) | -1(0方向)と思いがち |
| re.match('b', 'abc') | None(先頭のみ照合) | 一致すると思いがち |
| json.loads('[1, 2]') | [1, 2](リスト) | タプルに戻ると思いがち |
| list(map(str, [1, 2])) を2回 | 1回目のみ値、2回目は [] | 毎回同じ値と思いがち |
| all([]) | True | False と思いがち |
| [1, 2] is [1, 2] | False | True と思いがち |
- math.sqrt
- 平方根を返す。割り切れても float なので math.sqrt(16) は 4.0。math.floor(-1.5) は -2、math.ceil(-1.5) は -1。
- os.path.splitext
- パスを本体と拡張子に分けたタプルを返す。'z.txt' なら ('z', '.txt') で、点は拡張子側に付く。
- re.match と re.search
- match は文字列の先頭からしか照合しない。search は途中でも探す。一致しなければどちらも None。
- json.loads
- JSON 文字列を Python のオブジェクトへ戻す。JSON の配列はリストになり、元がタプルでもタプルには戻らない。
- Counter
- 要素の個数を数える辞書。most_common(n) で多い順に n 件のタプルのリストを返し、無いキーは 0 を返す。
- namedtuple
- 名前でも添字でも読めるタプルを作るファクトリ。作られたインスタンスは isinstance(p, tuple) が True。
- イテレータ
- next() で次の値を返し、尽きると StopIteration を送出する。map filter zip enumerate はこれを返すので一度きり。
- ジェネレータ
- yield を含む関数から作られるイテレータ。呼んだだけでは本体は動かず、最初の next() で先頭から実行が始まる。
- filter(None, 並び)
- 第1引数が None のとき、要素そのものの真偽で絞る。0 や空文字列や None が落ちる。
- all([]) と any([])
- 空の並びでは all は True、any は False。反例が無いから真、例が無いから偽、と読む。
- is と ==
- is は同じオブジェクトか、== は値が等しいか。中身の同じ別リストは == が True、is は False。None は is で比べる。
例題 例題:list(map(...)) で作った結果を変数に入れずに map のまま持ち回り、2か所で使ったら、後のほうが空になった。なぜか。
map が返すのはリストではなくイテレータで、一度取り出すと尽きるからです。最初の for や list() で全部読み切ってしまい、2回目には何も残っていません。2か所で使うなら、受け取った直後に list() でリストに固めます。同じことが filter zip enumerate とジェネレータでも起きるので、「複数回まわすならリストにする」と決めておくと事故が減ります。
例題 例題:条件を満たす要素が1つも無い並びに対して all() を呼んだら True が返った。バグか。
仕様どおりです。all は「偽の要素が1つも無い」ときに True を返すので、そもそも要素が無い空の並びでは True になります。逆に any は「真の要素が1つ以上ある」ときに True なので、空なら False です。空になりうる並びを all で判定するときは、len(並び) > 0 を先に確かめるか、and で組み合わせて意図を明示してください。
例題 例題:設定を辞書にして json.dumps で保存し、json.loads で読み戻したら、タプルだったはずの項目がリストになっていた。どう直すか。
JSON にはタプルという型が無いので、これは往復での型の変化として避けられません。dumps の時点でタプルは配列になり、loads はそれをリストとして戻します。タプルが必要なら、読み戻したあとにアプリケーション側で tuple() に変換します。同じ理屈で、辞書のキーは文字列化され、集合は json.dumps の時点で TypeError になります。JSON で表せる型に寄せてから保存するのが基本です。
出典:Python Software Foundation「Python チュートリアル 10. Brief tour of the standard library」Python 3.14 ドキュメント(2026年8月確認)