【JDLA E資格】出題傾向分析

#はじめに
JDLA E資格試験の出題傾向について分析したことを、まとめた記事です。
なお、これは__公式のものではなく、私が参考書や実際の経験をもとに出題傾向を分析したもの__です。
また、出題範囲を系統的分類し、外観しただけなので、具体的な解説はありません。
各パートの具体的な解説については、別途まとめる予定です。

[E資格試験に関する私の投稿記事リスト][link-1]
[link-1]:https://qiita.com/fridericusgauss/items/5a97f2645cdcefe15ce0

###目次
1. [公式シラバス](#公式シラバス)
2. [出題範囲の系統的分類](#出題範囲の系統的分類)
3. [前提となる基礎数学](#前提となる基礎数学-1)
4. [応用数学パート](#応用数学パート)
5. [機械学習パート](#機械学習パート)
6. [深層学習パート](#深層学習パート)
7. [開発・運用環境パート](#開発運用環境パート)
8. [Pythonコード](#pythonコード-1)
9. [出題パターン](#出題パターン)
10. [おわりに](#おわりに)

#公式シラバス
[JDLA公式シラバス][link-2]
[2020年版の詳細シラバス][link-3]
[__E資格対策問題集__][link-4]の章構成
[link-2]:https://www.jdla.org/certificate/engineer/
[link-3]:https://www.jdla.org/wp-content/uploads/2019/09/JDLA_E%E3%82%B7%E3%83%A9%E3%83%90%E3%82%B9_2020%E7%89%88.pdf
[link-4]:https://book.impress.co.jp/books/1118101176#_pt_link=https://www*_*google*_*com_s_fNt4ntIGLXDzQ0eNht9edg.0.432gKbjDvQ4l8l2WtUkm2A.1613911842640.5.1_s_1f5448ba.tdy/zrfxq48kMeUCPbIELg.y0f8gJQwzhIpd5kLRC/ixg.3.1.1613911842713

>第01章 線形代数
>第02章 確率・統計
>第03章 情報理論
>第04章 機械学習の基礎
>第05章 前処理・特徴選択・性能指標
>第06章 モデルの評価・正則化・ハイパーパラメータ探索
>第07章 教師あり学習の各種アルゴリズム
>第08章 教師なし学習の各種アルゴリズム
>第09章 強化学習の各種アルゴリズム
>第10章 深層学習の概要
>第11章 順伝播計算と逆伝播計算
>第12章 最適化手法
>第13章 畳み込みニューラルネットワーク
>第14章 再帰型ニューラルネットワーク
>第15章 深層学習を用いた自然言語処理
>第16章 深層学習を用いた生成モデル
>第17章 深層学習を用いた強化学習
>第18章 開発・運用環境
>第19章 総仕上げ問題
>付録 覚えておくべきPython/NumPyの知識


#出題範囲の系統的分類
E資格試験の出題範囲は、公式シラバスに加えて、私の受験経験を踏まえると、下記のように系統的分類できると考えられます。

>###_前提となる基礎数学_
>* _微積分_
>* _線形代数_
>* _確率・統計_
>
>###応用数学
>* 線形代数
>* 確率・統計
>* 情報理論
>
>###機械学習
>* 機械学習の基礎
>* モデル作成・モデル評価・モデル改善
>* 教師あり学習アルゴリズム
>* 教師なし学習アルゴリズム
>* 強化学習アルゴリズム
>
>###深層学習
>* 深層学習の概要
>* 深層学習の順伝播と逆伝播
>* 深層学習における最適化
>* 畳み込みニューラルネットワーク(CNN)
>* 再帰型ニューラルネットワーク(RNN)
>* 深層学習を用いた自然言語処理
>* 深層学習を用いた生成モデル
>* 深層強化学習
>
>###開発・運用環境
>* 開発環境
>* モデル圧縮
>* 分散深層学習・並列化
>
>###Pythonコード
>* 代表的なPythonモジュール(numpy、sk-learn)
>* numpyメソッド

これ以降では、上記の分類に従って、順に解説します。
__"前提となる基礎数学"は、直接出題される箇所ではないことにご注意ください。__


#前提となる基礎数学
これは出題範囲を理解するために必要な知識です。
__直接出題される箇所ではないことにご注意ください。__
経験上、前提となる基礎数学は下記の通りだと考えます。

>### 微積分
> * 一変数関数の微分
> * 一変数関数の積分
> * 多変数関数の偏微分
> * 多変数関数の多重積分
>
>### 線形代数
> * ベクトル：四則演算、ノルム、線形空間
> * 行列：四則演算、転置行列、逆行列、行列式
> * 連立1次方程式の行列表記
> * 表現行列と線形写像
>
>### 確率・統計
> * 場合の数と集合：順列、組合せ、事象の排反、和集合と積集合
> * 確率の基礎法則：和の法則、積の法則
> * 条件付き確率
> * 標本抽出
> * 多変量確率分布(同時確率分布)
> * 多変量の統計量：期待値、共分散行列

上記は高校~大学初等レベルで、E資格関連の問題文や解説などで当然のように使われるため、非常に重要な基礎知識です。
__高校数学レベルから自信がない方は、まずここから学習を開始するほうが良い__と思います。

なお、__私のQiitaの記事では、基本的にこのレベルをクリアしていることを前提として解説します__。
なぜなら、上記の知識については、高校数学・大学数学初学者向けの本が一般に多く販売されている上に、ネットで検索すれば容易に学ぶことができるためです。
また、JDLA認定プログラムでは、このレベルから学べるコースがあるので、初学者の方はそれを利用するのも手です。



#応用数学パート
このパートでは、機械学習や深層学習を理解する上で、よく使う知識が出題されます。

>### 線形代数
> * 固有値分解
> * 特異値分解
> * Lpノルム、距離関数
>
>### 確率・統計
> * 統計量：期待値、分散
> * 確率分布：正規分布、離散分布
> * 最尤法
> * ベイズの定理
>
>### 情報理論
> * エントロピー：自己情報量、シャノンの情報エントロピー、クロスエントロピー
> * ダイバージェンス：KL-ダイバージェンス、JS-ダイバージェンス


他のパートは、ほとんど知識問題であることに対して、このパートは、ほとんど計算問題か、定義式が問われる問題です。
なので、手を動かして何度も解くことと、定義式を書く練習が必要です。
一方、範囲が広くなく、出題パターンも限られているので、網羅的に学習しやすいです。
高得点を狙いやすいパートなので、下記の記事の通り、__9割の正解率を目指したい__ところです。

[【JDLA E資格】合格ラインと合格のための戦略][link-5]
[link-5]:https://qiita.com/fridericusgauss/items/98497e96c03d99cba327


#機械学習パート
機械学習全般に関する知識、深層学習ブーム以前から代表的な機械学習アルゴリズムについて問われます。
>### 機械学習の基礎
> * 機械学習の定義
> * バイアスとバリアンス(underfitとoverfit)
> * マルチタスク学習
>
>### モデル作成・モデル評価・モデル改善
> * データの前処理：カテゴリデータ、テキストデータ、時系列データの前処理
> * 正規化・標準化
> * 特徴選択
> * 性能指標：誤差関数、分類結果の混同行列・評価指標、数値予測の評価指標
> * データ分割によるモデル評価：ホールドアウト法、k-分割交差検証法
> * 正則化：汎化性能、underfitとoverfit、正則化テクニック
> * ハイパーパラメータ探索：グリッドサーチ、ランダムサーチ、ベイズ最適化
>
>### 教師あり学習アルゴリズム
> * 線形重回帰
> * 活性化関数、基底関数(カーネル法)
> * ロジスティック回帰：最尤法、オッズ、順伝播と逆伝播
> * サポートベクトルマシーン：ハードマージンとソフトマージン、カーネルトリック
> * k-近傍法
> * 識別関数、識別モデル、生成モデル
>
>### 教師なし学習アルゴリズム
> * クラスタリング：k-means法、k-means++、混合ガウスモデル
> * 次元削減：主成分分析
> * 次元の呪い：球面集中現象、特徴選択
>
>### 強化学習アルゴリズム
> * マルコフ決定過程に基づく強化学習モデルの基礎：方策・環境・エージェント、状態価値と行動価値、ベルマン方程式
> * 強化学習アルゴリズムの分類：モデルベース/モデルフリー、価値ベース/方策ベース/Actor-Critic系、方策オン型/方策オフ型
> * 動的計画法、モンテカルロ法
> * (古典的)TD学習(価値ベース)：Sarsa、Q学習
> * 方策ベース：方策勾配法

このパートでは、強化学習は古典的なアルゴリズムしか記載していませんが、深層学習が登場した以降、融合して__深層強化学習__へと発展したため、上記の基礎知識や分類を理解していると楽です。
(強化学習は分類が厄介なので)

機械学習パートはそこそこ範囲が広いですが、出題パターンが限られているため、これも網羅的に学習しやすいです。
また、各種アルゴリズムも、深層学習の代表的なモデルに比べると、原理がシンプルです。
よって、機械学習パートも高得点を狙いやすいパートなので、下記の記事の通り、__9割の正解率を目指したい__ところです。

[【JDLA E資格】合格ラインと合格のための戦略][link-5]


#深層学習パート
E資格試験のメインパートで、全体の約半分のボリュームを占めます。

>### 深層学習の概要
> * モデルの基本原理
> * 活性化関数：シグモイド関数、ソフトマックス関数、tanh関数、ReLU関数
> * 誤差関数：2乗和誤差、クロスエントロピー誤差
> * バックプロパゲーション：連鎖律
> * ミニバッチ学習
> * 深層学習を用いた画像認識と自然言語処理の基礎
> * 深層学習を用いた生成モデルと強化学習の基礎
> * 表現学習：End-to-end
> * 万能近似定理
>
>### 深層学習の順伝播と逆伝播
> * 計算グラフ：スカラ演算、行列演算
> * 活性化関数・誤差関数の順伝播・逆伝播時の計算
> * 全結合型ニューラルネットワークの順伝播と逆伝播の計算
> * オートエンコーダ：Denoising Auto-Encoder、Contractive Auto-Encoder
>
>### 深層学習における最適化
> * 最適化アルゴリズム：確率的勾配降下法、モーメンタム法、ネステロフのモーメンタム法、AdaGrad、RMSProp、Adam
> * ドロップアウト
> * 正則化：Weight Decay、Parameter Sharing
> * データ拡張
> * 早期終了
> * 画像分類タスク用の正規化：バッチ正規化、レイヤー正規化、インスタンス正規化、グループ正規化
>
>### 畳み込みニューラルネットワーク(CNN)
> * 畳み込み層の原理：特徴マップ
> * プーリング層の原理：max pooling
> * 実装テクニック：im2col
> * 軽量化CNNモデル：MobileNet
> * 画像分類タスク用の代表的なCNN：AlexNet、VGG、GoogLeNet、ResNet、DenseNet
> * 物体検出タスクの評価指標：Intersection over Union、Area Under the Curve、Average Precision、mAP
> * 物体検出タスク用の代表的なCNN：R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD
> * セマンティックセグメンテーション：条件付き確率場、IoU、Dice係数
> * セグメンテーションタスク用の代表的なCNN：FCN、SegNet、U-Net
> * 転移学習
> * 動画像タスク用のCNNの層設計
>
>### 再帰型ニューラルネットワーク(RNN)
> * Simple RNNの順伝播・逆伝播、計算グラフ
> * ゲート付きRNN：LSTM、GRU、計算グラフ
> * 代表的なRNN：Echo State Network、スキップ接続、Leaky Unit、Bidirectional RNN
> * Attention：Query/Key/Value、Soft-Attention、Hard-Attention
> * 系列変換モデル：RNNエンコーダ・デコーダ、seq2seq、Global-Attention Model
>
>### 深層学習を用いた自然言語処理
> * word2vec
> * GNMT
> * RNNを用いた自然言語処理
> * CNNを用いた自然言語処理：WaveNet
> * Transformer：Self-Attention、Positional Encoding
> * BERT
>
>### 深層学習を用いた生成モデル
> * VAE
> * GAN：Deep Convolutional GAN(DCGAN)、ConditionalGAN、pix2pix
>
>### 深層強化学習
> * DQN
> * AlphaGo


##深層学習パートの特徴
深層学習パートの特徴は下記の通りです。

  * __各タスクで成功した代表的なモデルが数十個も出題されること__
これは、"深層学習"と一言で言っても、2015年頃から一気に多くのモデルとテクニックが提案され、実は数多くの種類が存在するためです。
近年の深層学習の論文では、この代表的なモデルをベースに改良する、比較対象として使用する、などが当然のように行われているので、E資格の範囲とされているのだと想像します。

  * __データやタスクも多岐に渡ること__
機械学習パートでは、単なる数値データの回帰・分類タスクだけを扱いましたが、深層学習パートでは、画像や音声、テキストなど、扱うデータの種類が増えるため、どのようにデータ化して処理するのかを理解する必要があります。
さらに、"画像認識"と一言で言っても、画像分類、物体検出、セグメンテーションなど、実はタスクも細分化されており、タスク毎にモデルも異なるため、このタスクについても理解する必要があります。

深層学習パートの出題傾向は全体的に定まってきています。
しかしながら、そのボリュームの多さに加えて、深層学習の計算、数式、実装、モデル図、タスク特有のテクニックなど、問われる内容も多岐に渡り、かつ複雑になります。
よって、深層学習パートは、初心者にとって比較的高得点を狙いにくいパートなので、下記の記事の通り、__まずは5割の正解率を目指し、他のパートを優先したい__ところです。

[【JDLA E資格】合格ラインと合格のための戦略][link-5]

深層学習パートの5割を目指す場合、下記の箇所が、比較的易しく、かつ、ボリュームがほぼ5割なので、優先的に学習すると達成しやすいと思います。
>深層学習の概要、深層学習の順伝播・逆伝播、深層学習における最適化、CNNの畳み込みやプーリングの原理、RNNの基礎とゲート付きRNN

なお、合格のための戦略をほぼ達成できそうならば、深層学習パートの残りの学習を進めましょう。


#開発・運用環境パート
深層学習は通常の環境でそのまま実装しても、そのモデルの大きさが要因で上手く実現できないことが多々あります。
深層学習が、近年のAIブームを牽引しているのは、深層学習自体のテクニックに加えて、開発環境の整備やモデル圧縮・並列化が実現されたためでもあります。
このパートは、その環境にフォーカスを当てて出題されます。

>### 開発環境
>  * 深層学習用フレームワーク：TensorFlow、PyTorch
>  * GPGPU
>
>### モデル圧縮
>  * 蒸留
>  * 量子化
>  * 剪定・枝刈り
>
>### 分散深層学習・並列化
>  * データ並列：同期型・非同期型
>  * モデル並列

いずれも深層学習向けの環境やテクニックに関する知識ですが、内容は深層学習パートに比べてかなり浅いため、深層学習について深い理解が無くても、容易に理解できます。
なお、深層学習用フレームワークについては、それを使った実装が問われるわけではなく、「どのフレームワークを、どの企業が開発したのか？」など、その背景について出題されます。
よって、開発・運用環境パートも高得点を狙いやすいパートなので、下記の記事の通り、__9割の正解率を目指したい__ところです。

[【JDLA E資格】合格ラインと合格のための戦略][link-5]


#Pythonコード
Pythonコードは、独立したパートではなく、各パートでそれぞれ出題されます。
データ処理、あるいは機械学習・深層学習アルゴリズムを実装するコードに関する問題です。

>### 代表的なPythonモジュール
>  * numpy
>  * sk-learn
>
>### numpyのメソッド
>  * numpy.sum、numpy.mean、numpy.argminなど

アルゴリズムについては、理論を知っていれば対処可能な箇所がありますが、numpyのメソッドについてはとにかく実装経験がないと身につきません。
例えば、k-means法を実装したPythonコードを見せられて、一部が空いています。
この空いた箇所が設問で選択肢があり、設問箇所で与えられたデータを適切に処理するには、numpy.sum()メソッドのaxisをどう設定すれば良いか？などが問われます。

出題範囲のデータ処理や各種アルゴリズムを実装した経験があれば、難易度は高くないと思います。
よく見かける出題例は、下記の通りです。

> <dl>
>  <dt>機械学習パート</dt>
>  <dd>正規化・標準化、ロジスティック回帰、k-近傍法、k-means法、主成分分析</dd>
>  <dt>深層学習パート</dt>
>  <dd>全結合型ニューラルネットワークの順伝播と逆伝播、最適化アルゴリズム、ドロップアウト、CNNの畳み込み・プーリング(im2col)、Simple RNNの順伝播・逆伝播、LSTM・GRUの順伝播</dd>
> </dl>

一方、私はPythonコードについて基本的に扱わない予定です。
理由は、__各自がJDLA認定プログラムにて実装演習を行うため__と、__Qiita上でPython実装に関する知識はすでに豊富に存在しているため__です。

敢えて言うなら、下記の問題集の付録で、E資格試験に頻出するnumpyメソッドがまとめてありますので、それをご覧ください。
[__E資格対策問題集__][link-4]


#出題パターン
知識系、計算系、コード系に分類されます。
###知識系
ある機械学習に関する文章が書かれており、その文章内にいくつか空欄があるので、そこを選択肢から選んで埋める系統の問題です。
大半の問題はこれに該当します。

知識系も下記のタイプに細分化されます。

  * 名称・説明・理由：「○○は、~となる場合がある。これは(ア)と呼ばれる。また、○○は、~のため、(イ)となりやすい。空欄に最もよく当てはまる選択肢を選べ。」など。
  * 適切・不適切：「~に関する記述として適切/不適切なものを1つ選べ。」
 
例えば、下記の文があったとします。(便宜上、図1を登場しますが、実際には記載していません)
>Simple RNNは勾配消失問題のため、長期データを学習することが困難であった。
>そこで、LSTMやGRUのようなゲート付きRNNが提案され、勾配消失問題を解消した。
>図1はGRUの計算グラフを示している。
>図1のAの部分はリセットゲート、Bの部分は更新ゲートと呼ばれる。
>リセットゲートは、過去の隠れ状態を弱める程度を決める役割があり、更新ゲートは、過去の隠れ状態と仮の隠れ状態の混合割合を決める役割がある。

これが下記のように穴空き状態となり、名称や説明などを埋めることが多いです。
>Simple RNNは(ア)のため、長期データを学習することが困難であった。
>そこで、LSTMやGRUのようなゲート付きRNNが提案され、(ア)を解消した。
>図1はGRUの計算グラフを示している。
>図1のAの部分は(イ)、Bの部分は(ウ)と呼ばれる。
>(イ)は(エ)役割があり、(ウ)は(オ)役割がある。

このため、単に単語同士を結びつける(GRUはリセットゲートと更新ゲート)だけでなく、「その単語がどのような役割を果たすのか」までを覚えておく必要があります。


###計算系
具体的に変数に値が与えられ、定義式に従って計算し、値を求める問題です。
あるいは、アルゴリズムの計算量や計算効率を問われることもあります。
定義式を覚えることはもちろん、式変形や演算の練習も必要です。

__計算系の問題は出題パターンが少なく、解くことも難しくないため、確実に正解したい問題です。__
よく見かける出題例は、下記の通りです。
> <dl>
>  <dt>応用数学パート</dt>
>  <dd>固有値分解、特異値分解、正規分布・離散分布の最尤法、ベイズの定理</dd>
>  <dt>機械学習パート</dt>
>  <dd>分類結果の混同行列・評価指標、k-分割交差検証法の計算量、ロジスティック回帰の最尤法・オッズ</dd>
>  <dt>深層学習パート</dt>
>  <dd>計算グラフ(スカラ演算・行列演算)、バックプロパゲーションの計算量、CNNの特徴マップのサイズ、CNNの畳み込み・プーリングの計算量(im2col)、Intersection over Union、Average Precision、Dice係数</dd>
> </dl>


###コード系
上記のPythonコードで記述した形式の問題です。


#おわりに
E資格の出題傾向を分析し、外観しました。
なお、上記は、2021年2月時点における内容であることにご注意ください。

今後は、各パートの具体的な問題と解説について、別途まとめていく予定です。

[E資格試験に関する私の投稿記事リスト][link-1]