IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 株式会社ソシオネクストの特許一覧

<>
  • 特許-演算方法 図1
  • 特許-演算方法 図2
  • 特許-演算方法 図3A
  • 特許-演算方法 図3B
  • 特許-演算方法 図4A
  • 特許-演算方法 図4B
  • 特許-演算方法 図5
  • 特許-演算方法 図6
  • 特許-演算方法 図7
  • 特許-演算方法 図8
  • 特許-演算方法 図9
  • 特許-演算方法 図10
  • 特許-演算方法 図11
  • 特許-演算方法 図12
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2022-09-05
(45)【発行日】2022-09-13
(54)【発明の名称】演算方法
(51)【国際特許分類】
   G06N 3/063 20060101AFI20220906BHJP
   G06F 17/16 20060101ALI20220906BHJP
【FI】
G06N3/063
G06F17/16 B
【請求項の数】 7
(21)【出願番号】P 2020523858
(86)(22)【出願日】2018-06-04
(86)【国際出願番号】 JP2018021371
(87)【国際公開番号】W WO2019234794
(87)【国際公開日】2019-12-12
【審査請求日】2021-05-19
(73)【特許権者】
【識別番号】514315159
【氏名又は名称】株式会社ソシオネクスト
(74)【代理人】
【識別番号】100189430
【弁理士】
【氏名又は名称】吉川 修一
(74)【代理人】
【識別番号】100190805
【弁理士】
【氏名又は名称】傍島 正朗
(72)【発明者】
【氏名】山倉 誠
【審査官】中村 信也
(56)【参考文献】
【文献】特許第6250782(JP,B1)
【文献】特開2002-269067(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06N 3/063
G06F 17/16
(57)【特許請求の範囲】
【請求項1】
LSIが内部に有する演算器と内部メモリとを用いて、ニューラルネットワークの畳み込み層における畳み込み演算を行列積演算により行う演算方法であって、
畳み込み層ごとに、当該畳み込み層に入力される入力データが所定のデータ量以下であるか否かを判定する判定ステップと、
前記判定ステップにおいて、前記入力データが所定のデータ量以下であると判定された場合、第1の演算モードを選択して、前記第1の演算モードで畳み込み演算を実行するステップと、
前記判定ステップにおいて、前記入力データが所定のデータ量より大きいと判定された場合、第2の演算モードを選択して、前記第2の演算モードで畳み込み演算を実行するステップと、
畳み込み演算を実行することにより得られた結果である出力データを出力する出力ステップとを含み、
前記第1の演算モードで畳み込み演算を実行するステップでは、
当該畳み込み層の重みデータを、前記LSIの外部にある外部メモリに配置するステップと、
当該畳み込み層の前記入力データを前記内部メモリに配置するステップと、
前記外部メモリから、前記重みデータを、一部ずつ、1以上の行または列ベクトルデータとして前記内部メモリに読み出して、前記内部メモリに配置された前記入力データの行列との行列積演算を前記演算器に行わせるステップとを含み、
前記重みデータは、全体として、前記外部メモリから前記内部メモリに一度だけ読み出され、
前記第2の演算モードで畳み込み演算を実行するステップでは、
当該畳み込み層の入力データを、前記LSIの外部にある外部メモリに配置するステップと、
当該畳み込み層の重みデータの行列を前記内部メモリに配置するステップと、
前記外部メモリから、前記入力データを、一部ずつ、1以上の列または行ベクトルデータとして前記内部メモリに読み出して、前記内部メモリに配置された前記重みデータの行列との行列積演算を前記演算器に行わせるステップとを含み、
前記入力データは、全体として、前記外部メモリから前記内部メモリに一度だけ読み出される、
演算方法。
【請求項2】
前記出力ステップでは、前記出力データを、前記内部メモリまたは前記外部メモリに、当該畳み込み層の後段の層における入力データとして配置することで、前記出力データを出力する、
請求項1に記載の演算方法。
【請求項3】
前記後段の層は、畳み込み層、プーリング層、または、正規化層である、
請求項2に記載の演算方法。
【請求項4】
前記第1の演算モードで畳み込み演算を実行するステップでは、
前記内部メモリに配置された前記入力データを、サンプリングすることで前記入力データの行列に変換するステップを含み、
前記第2の演算モードで畳み込み演算を実行するステップでは、
前記内部メモリに読み出した前記入力データの一部を、サンプリングすることで、前記1以上の列または行ベクトルデータに変換するステップを含む、
請求項1~3のいずれか1項に記載の演算方法。
【請求項5】
前記第2の演算モードで畳み込み演算を実行するステップでは、
前記入力データは、前記外部メモリにタイル状の形式で配置される、
請求項1~4のいずれか1項に記載の演算方法。
【請求項6】
前記出力ステップでは、前記出力データが前記外部メモリに配置される場合、前記出力データは、前記外部メモリにタイル状の形式で配置される、
請求項1~5のいずれか1項に記載の演算方法。
【請求項7】
LSIが内部に有する演算器と内部メモリとを用いて、ニューラルネットワークの畳み込み層における畳み込み演算を行列積演算により行う演算方法であって、
畳み込み層ごとに、当該畳み込み層に入力される入力データが所定のデータ量以下であるか否かを判定する判定ステップと、
前記判定ステップにおいて、前記入力データが所定のデータ量以下であると判定された場合、第1の演算モードを選択して、前記第1の演算モードで畳み込み演算を実行するステップと、
前記判定ステップにおいて、前記入力データが所定のデータ量より大きいと判定された場合、第2の演算モードを選択して、前記第2の演算モードで畳み込み演算を実行するステップと、
畳み込み演算を実行することにより得られた結果である出力データを出力する出力ステップとを含み、
前記第1の演算モードで畳み込み演算を実行するステップでは、
当該畳み込み層の重みデータを、前記LSIの外部にある外部メモリに配置するステップと、
当該畳み込み層の前記入力データを前記内部メモリに配置するステップと、
前記外部メモリから、前記重みデータを、一部ずつ、1以上の行または列ベクトルデータとして前記内部メモリに読み出して、前記内部メモリに配置された前記入力データの行列との行列積演算を前記演算器に行わせるステップとを含み、
前記重みデータは、全体として、前記外部メモリから前記内部メモリに一度だけ読み出され、
第2の演算モードで畳み込み演算を実行するステップでは、
当該畳み込み層の入力データ及び重みデータを、前記LSIの外部にある外部メモリに配置するステップと、
前記外部メモリから、前記重みデータの一部を、1以上の行または列ベクトルデータである第1ベクトルデータとして前記内部メモリに配置するステップと、
前記外部メモリから、前記入力データを、一部ずつ、1以上の列または行ベクトルデータとして前記内部メモリに読み出して、前記内部メモリに配置された前記第1ベクトルデータとの行列積演算を前記演算器に行わせるステップと、
前記外部メモリから、前記重みデータの一部と異なる一部を、1以上の行または列ベクトルデータである第2ベクトルデータとして前記内部メモリに配置するステップと、
前記外部メモリから、前記入力データを、一部ずつ、1以上の列または行ベクトルデータとして前記内部メモリに読み出して、前記内部メモリに配置された前記第2ベクトルデータとの行列積演算を前記演算器に行わせるステップとを含み、
前記重みデータは、全体として、前記外部メモリから前記内部メモリに一度だけ読み出される、
演算方法。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、演算方法に関し、特に、畳み込みニューラルネットワークの畳み込み層における畳み込み演算を行う演算方法に関する。
【背景技術】
【0002】
近年、局所領域の畳み込み(Convolution)を繰り返す多層のニューラルネットワークからなる畳み込みニューラルネットワークを用いて、画像認識を行うことが可能になっている。
【0003】
また、多次元データに対して演算処理を行うことができるLSIチップを用いて、畳み込みニューラルネットワークの畳み込み層における畳み込み演算を行うことができることが知られている(例えば、特許文献1)。特許文献1では、LSIチップに内蔵するメモリ回路ブロックのメモリサイズを超える2次元データに対する演算処理を効率的に実行可能な技術が開示されている。
【先行技術文献】
【特許文献】
【0004】
【文献】特開2007-206887号公報
【発明の概要】
【発明が解決しようとする課題】
【0005】
ところで、近年のディープラーニング技術の進展により、畳み込みニューラルネットワークを用いた画像認識の認識率は向上しているものの、ネットワーク規模が巨大化している。このため、畳み込み層の1層あたりの演算処理量も大きくなっている。
【0006】
しかしながら、特許文献1では、比較的小規模の畳み込みニューラルネットワークにおける畳み込み演算が演算処理対象となっている。このため、特許文献1に開示される技術では、大規模な畳み込みニューラルネットワークにおける畳み込み演算を行う際、入力データを外部から読み出して用いることになるので消費電力が大きくなってしまうという問題がある。
【0007】
換言すると、特許文献1に開示されるようなLSIチップでは、LSIチップの内部に搭載される内部メモリに収まらないサイズの処理結果は外部メモリに出力せざるを得ない。そして、後段の畳み込み層で再び入力データとして内部メモリに読み出して用いる必要があることから、消費電力が大きくなってしまう。一方で、LSIチップにおいて、消費電力を抑制するために、演算処理結果を一時的に保持する内部メモリの容量を大きくすると、コストアップにつながってしまうという問題もある。
【0008】
本開示は、上述の事情を鑑みてなされたもので、例えば数Mバイト以下といった限られた容量の内部メモリであっても、消費電力をより抑制しながら畳み込み演算を行うことができる演算方法を提供することを目的とする。
【課題を解決するための手段】
【0009】
本開示の一形態に係る演算方法は、LSIが内部に有する演算器と内部メモリとを用いて、ニューラルネットワークの畳み込み層における畳み込み演算を行列積演算により行う演算方法であって、畳み込み層ごとに、当該畳み込み層に入力される入力データが所定のデータ量以下であるか否かを判定する判定ステップと、前記判定ステップにおいて、前記入力データが所定のデータ量以下であると判定された場合、第1の演算モードを選択して、前記第1の演算モードで畳み込み演算を実行するステップと、前記判定ステップにおいて、前記入力データが所定のデータ量より大きいと判定された場合、第2の演算モードを選択して、前記第2の演算モードで畳み込み演算を実行するステップと、畳み込み演算を実行することにより得られた結果である出力データを出力する出力ステップとを含み、前記第1の演算モードで畳み込み演算を実行するステップでは、当該畳み込み層の重みデータを、前記LSIの外部にある外部メモリに配置するステップと、当該畳み込み層の前記入力データを前記内部メモリに配置するステップと、前記外部メモリから、前記重みデータを、一部ずつ、1以上の行または列ベクトルデータとして前記内部メモリに読み出して、前記内部メモリに配置された前記入力データの行列との行列積演算を前記演算器に行わせるステップとを含み、前記重みデータは、全体として、前記外部メモリから前記内部メモリに一度だけ読み出され、前記第2の演算モードで畳み込み演算を実行するステップでは、当該畳み込み層の入力データを、前記LSIの外部にある外部メモリに配置するステップと、当該畳み込み層の重みデータの行列を前記内部メモリに配置するステップと、前記外部メモリから、前記入力データを、一部ずつ、1以上の列または行ベクトルデータとして前記内部メモリに読み出して、前記内部メモリに配置された前記重みデータの行列との行列積演算を前記演算器に行わせるステップとを含み、前記入力データは、全体として、前記外部メモリから前記内部メモリに一度だけ読み出される。
【0010】
これにより、限られた容量の内部メモリであっても、消費電力をより抑制しながら畳み込み演算を行うことができる。
【0011】
ここで、例えば、前記出力ステップでは、前記出力データを、前記内部メモリまたは前記外部メモリに、当該畳み込み層の後段の層における入力データとして配置することで、前記出力データを出力するとしてもよい。
【0012】
また、例えば、前記後段の層は、畳み込み層、プーリング層、または、正規化層であるとしてもよい。
【0013】
また、例えば、前記第1の演算モードで畳み込み演算を実行するステップでは、前記内部メモリに配置された前記入力データを、サンプリングすることで前記入力データの行列に変換するステップを含み、前記第2の演算モードで畳み込み演算を実行するステップでは、前記内部メモリに読み出した前記入力データの一部を、サンプリングすることで、前記1以上の列または行ベクトルデータに変換するステップを含むとしてもよい。
【0014】
また、例えば、前記第2の演算モードで畳み込み演算を実行するステップでは、前記入力データは、前記外部メモリにタイル状の形式で配置されるとしてもよい。
【0015】
また、例えば、前記出力ステップでは、前記出力データが前記外部メモリに配置される場合、前記出力データは、前記外部メモリにタイル状の形式で配置されるとしてもよい。
【0016】
また、本開示の一形態に係る演算方法は、LSIが内部に有する演算器と内部メモリとを用いて、ニューラルネットワークの畳み込み層における畳み込み演算を行列積演算により行う演算方法であって、畳み込み層ごとに、当該畳み込み層に入力される入力データが所定のデータ量以下であるか否かを判定する判定ステップと、前記判定ステップにおいて、前記入力データが所定のデータ量以下であると判定された場合、第1の演算モードを選択して、前記第1の演算モードで畳み込み演算を実行するステップと、前記判定ステップにおいて、前記入力データが所定のデータ量より大きいと判定された場合、第2の演算モードを選択して、前記第2の演算モードで畳み込み演算を実行するステップと、畳み込み演算を実行することにより得られた結果である出力データを出力する出力ステップとを含み、前記第1の演算モードで畳み込み演算を実行するステップでは、当該畳み込み層の重みデータを、前記LSIの外部にある外部メモリに配置するステップと、当該畳み込み層の前記入力データを前記内部メモリに配置するステップと、前記外部メモリから、前記重みデータを、一部ずつ、1以上の行または列ベクトルデータとして前記内部メモリに読み出して、前記内部メモリに配置された前記入力データの行列との行列積演算を前記演算器に行わせるステップとを含み、前記重みデータは、全体として、前記外部メモリから前記内部メモリに一度だけ読み出され、第2の演算モードで畳み込み演算を実行するステップでは、当該畳み込み層の入力データ及び重みデータを、前記LSIの外部にある外部メモリに配置するステップと、前記外部メモリから、前記重みデータの一部を、1以上の行または列ベクトルデータである第1ベクトルデータとして前記内部メモリに配置するステップと、前記外部メモリから、前記入力データを、一部ずつ、1以上の列または行ベクトルデータとして前記内部メモリに読み出して、前記内部メモリに配置された前記第1ベクトルデータとの行列積演算を前記演算器に行わせるステップと、前記外部メモリから、前記重みデータの一部と異なる一部を、1以上の行または列ベクトルデータである第2ベクトルデータとして前記内部メモリに配置するステップと、前記外部メモリから、前記入力データを、一部ずつ、1以上の列または行ベクトルデータとして前記内部メモリに読み出して、前記内部メモリに配置された前記第2ベクトルデータとの行列積演算を前記演算器に行わせるステップとを含み、前記重みデータは、全体として、前記外部メモリから前記内部メモリに一度だけ読み出される。
【0017】
なお、これらの包括的または具体的な態様は、システム、方法、集積回路、コンピュータプログラムまたはコンピュータで読み取り可能なCD-ROMなどの記録媒体で実現されてもよく、システム、方法、集積回路、コンピュータプログラム及び記録媒体の任意な組み合わせで実現されてもよい。
【発明の効果】
【0018】
本開示の演算方法によれば、限られた容量の内部メモリであっても、消費電力をより抑制しながら畳み込み演算を行うことができる。
【図面の簡単な説明】
【0019】
図1図1は、実施の形態に係る演算システムの構成の一例を示すブロック図である。
図2図2は、実施の形態に係る畳み込みニューラルネットの構成の一例を示す図である。
図3A図3Aは、行列積演算により畳み込み演算を行う方法の説明図である。
図3B図3Bは、行列積演算により畳み込み演算を行う方法の説明図である。
図4A図4Aは、実施の形態に係る外部メモリにおける出力データの配置方法を示す図である。
図4B図4Bは、実施の形態に係る外部メモリにおける出力データの配置方法を示す図である。
図5図5は、実施の形態に係る演算システムの動作概要を示すフローチャートである。
図6図6は、図5に示すステップS3の動作詳細を示すフローチャートである。
図7図7は、図5に示すステップS6の動作詳細を示すフローチャートである。
図8図8は、実施の形態に係る第1の演算モードでの演算方法の効果を説明するための図である。
図9図9は、実施の形態に係る第1の演算モードでの演算方法の効果を説明するための図である。
図10図10は、実施の形態に係る第2の演算モードでの演算方法の効果を説明するための図である。
図11図11は、変形例に係るステップS6の動作詳細を示すフローチャートである。
図12図12は、変形例に係る第2の演算モードでの演算方法の効果を説明するための図である。
【発明を実施するための形態】
【0020】
以下、本開示の実施の形態について、図面を用いて詳細に説明する。なお、以下で説明する実施の形態は、いずれも本開示の一具体例を示すものである。以下の実施の形態で示される数値、形状、材料、構成要素、構成要素の配置位置及び接続形態、使用手順、通信手順等は、一例であり、本開示を限定する主旨ではない。また、以下の実施の形態における構成要素のうち、本開示の最上位概念を示す独立請求項に記載されていない構成要素については、任意の構成要素として説明される。また、各図は、必ずしも厳密に図示したものではない。各図において、実質的に同一の構成については同一の符号を付し、重複する説明は省略または簡略化する。
【0021】
(実施の形態)
以下では、図面を参照しながら、実施の形態に係る演算方法等の説明を行う。
【0022】
[システムの構成]
図1は、実施の形態に係る演算システム1の構成の一例を示すブロック図である。
【0023】
図1に示す演算システム1は、回路10と、外部メモリ20と、判定部30と、制御部40と、出力部50とを備える。図2は、実施の形態に係る畳み込みニューラルネットワーク60の構成の一例を示す図である。
【0024】
[外部メモリ20]
外部メモリ20は、回路10の外部にあり、例えばEEPROM、フラッシュメモリ等の不揮発メモリ、ハードディスク、または、電池つきRAMなどによって構成される。本実施の形態では、外部メモリ20には、制御部40が選択する第1の演算モードまたは第2の演算モードに応じて、例えば畳み込みニューラルネットワーク60の演算処理対象の畳み込み層における重みデータ、または、入力データが配置される。また、外部メモリ20には、回路10に畳み込み演算を行わせることにより得られた出力データが配置されてもよい。
【0025】
ここで、図2を用いて、畳み込みニューラルネットワーク60の構成の一例について説明する。図2では、畳み込みニューラルネットワークを、CNN(Convolutional Neural Network)と表記している。
【0026】
[畳み込みニューラルネットワーク60]
畳み込みニューラルネットワーク60は、畳み込み層(Conv)とプーリング層(Pooling Layer)と正規化層(Normalize Layer)とを繰り返す多層のニューラルネットワークである。図2に示す例では、畳み込みニューラルネットワーク60は、2つ目のプーリング層の後段に異なる3つの畳み込み層が接続されている。
【0027】
本実施の形態では、例えば畳み込みニューラルネットワーク60を構成する複数の畳み込み層における畳み込み演算を回路10に行わせる。
【0028】
[回路10]
回路10は、例えばLSIまたはLSIチップで構成され、例えば畳み込みニューラルネットワーク60の畳み込み層における畳み込み演算を行列積演算により行う。回路10は、図1に示すように、内部に、演算器11と、内部メモリ12とを有する。
【0029】
<内部メモリ12>
内部メモリ12は、比較的小さい容量からなり、例えばRAMなどによって構成される。ここで、比較的小さい容量の一例としては、数百kバイト~数Mバイト以下の容量が考えられる。本実施の形態では、内部メモリ12は、後述する制御部40により制御される。内部メモリ12は、制御部40が選択する第1の演算モードまたは第2の演算モードに応じて、例えば畳み込みニューラルネットワーク60の演算処理対象の畳み込み層における重みデータの一部ずつ、または、当該重みデータが配置される。また、内部メモリ12は、制御部40が選択する第1の演算モードまたは第2の演算モードに応じて、例えば畳み込みニューラルネットワーク60の演算処理対象の畳み込み層の入力データの一部ずつまたは、当該入力データが配置される。
【0030】
なお、内部メモリ12は、回路10に畳み込み演算を行わせることにより得られた出力データが配置されてもよい。
【0031】
<演算器11>
演算器11は、後述する制御部40により制御される。演算器11は、図1に示すように積和演算部111と、データ変換部112とを有する。
【0032】
≪積和演算部111≫
積和演算部111は、制御部40により制御され、畳み込み演算を行列積演算により行う。
【0033】
ここで、図3A及び図3Bを用いて、畳み込み演算を行列積演算により行う方法について説明する。図3A及び図3Bは、実施の形態に係る行列積演算により畳み込み演算を行う方法の説明図である。
【0034】
重みデータと入力データとの畳み込み演算を行うことは、重みデータと入力データとの行列積を演算することに相当することが知られている。ここで、例えば図3Aに示すように、重みデータがCo×K行列で表され、入力データがCi×L行列で表されるとする。この場合、例えばサンプリングなどのデータ変換を入力データに行い、K×N行列で表される変換後の入力データを用いて、重みデータとの行列積を演算する。p×q行列とr×s行列の積(行列積)はq=rのときのみ定義されるからである。そして、その結果は、p×s行列になることから、重みデータと変換後の入力データの行列積の結果である出力データは、Co×N行列で表されることになる。
【0035】
重みデータと入力データとの行列積のより具体的な方法は、例えば図3Bに示されている。すなわち、重みデータの1行目の成分と変換後の入力データの1列目の成分の積和が出力データの1行1列目の成分となり、重みデータの1行目の成分と変換後の入力データの2列目の成分の積和が出力データの1行2列目の成分となる。このように、重みデータのa行目の成分と変換後の入力データのb列目の成分の積和が出力データのa行b列目の成分となるようにして行列積が演算される。
【0036】
なお、行列積演算により畳み込み演算を行う場合、出力データの各要素にはバイアスデータをさらに加える場合もある。
【0037】
また、図3A及び図3Bでは、重みデータの行列と変換後の入力データの行列との行列積をこの順で演算するとして説明したが、これに限らない。変換後の入力データの行列と重みデータの行列との行列積をこの順で演算するとしてよい。この場合には、変換後の入力データの1行の成分数が、重みデータの行列の1列の成分数と同一となるように入力データをサンプリングしてデータ変換すればよい。
【0038】
本実施の形態では、積和演算部111は、第1の演算モードが選択された場合、外部メモリ20から、一部ずつ、1以上の行または列ベクトルデータとして内部メモリ12に読み出された重みデータと、内部メモリ12に配置された入力データの行列との行列積演算を行う。積和演算部111は、第2の演算モードが選択された場合、内部メモリ12に配置された重みデータの行列と、外部メモリ20から、一部ずつ、1以上の列または行ベクトルデータとして内部メモリ12に読み出された入力データとの行列積演算を行う。
【0039】
≪データ変換部112≫
データ変換部112は、制御部40により制御され、内部メモリ12に読み出された一部の入力データまたは内部メモリ12に配置された入力データを、サンプリングによりデータ変換する。これにより、データ変換された入力データは、重みデータの行列と行列積演算することができる。
【0040】
本実施の形態では、データ変換部112は、第1の演算モードが選択された場合、内部メモリ12に配置された入力データを、サンプリングすることで入力データの行列に変換する。また、データ変換部112は、第2の演算モードが選択された場合、内部メモリ12に読み出した入力データの一部を、サンプリングすることで、1以上の列または行ベクトルデータに変換する。
【0041】
[判定部30]
判定部30は、図示しないCPU(Central Processing Unit)と、メモリとなどにより実現される。判定部30は、畳み込み層ごとに、当該畳み込み層に入力される入力データが所定のデータ量以下であるか否かを判定する。ここで、所定のデータ量は、例えば内部メモリ12のうち入力データに割り当てられる最大の容量(サイズ)である。
【0042】
本実施の形態では、判定部30は、例えば図2に示す畳み込みニューラルネットワーク60の演算処理対象となる畳み込み層ごとに、当該畳み込み層に入力される入力データが所定のデータ量以下であるか否かを判定する。なお、図2に示すように、同一レイヤの後段に複数の畳み込み層が接続される場合には、判定部30は、各々の畳み込み層ごとに入力される入力データが所定のデータ量以下であるか否かを判定すればよい。
【0043】
[制御部40]
制御部40は、図示しないCPUと、メモリとなどにより実現される。制御部40は、判定部30により入力データが所定のデータ量以下であると判定された場合、第1の演算モードを選択して、第1の演算モードで畳み込み演算を実行する。より詳細には、制御部40は、第1の演算モードを選択した場合、当該畳み込み層の重みデータを、回路10の外部にある外部メモリ20に配置し、当該畳み込み層の入力データを内部メモリ12に配置する。そして、制御部40は、外部メモリ20から、重みデータを、一部ずつ、1以上の行または列ベクトルデータとして内部メモリ12に読み出して、内部メモリ12に配置された入力データの行列との行列積演算を積和演算部111に行わせる。これにより、重みデータは、全体として、外部メモリ20から内部メモリ12に一度だけ読み出されることになる。
【0044】
一方、制御部40は、判定部30により入力データが所定のデータ量より大きいと判定された場合、第2の演算モードを選択して、第2の演算モードで畳み込み演算を実行する。より詳細には、制御部40は、第2の演算モードを選択した場合、当該畳み込み層の入力データを、回路10の外部にある外部メモリ20に配置し、当該畳み込み層の重みデータの行列を内部メモリ12に配置する。そして、制御部40は、外部メモリ20から、入力データを、一部ずつ、1以上の列または行ベクトルデータとして内部メモリ12に読み出して、内部メモリ12に配置された重みデータの行列との行列積演算を積和演算部111に行わせる。これにより、入力データは、全体として、外部メモリ20から内部メモリ12に一度だけ読み出されることになる。
【0045】
[出力部50]
出力部50は、畳み込み演算を実行することにより得られた結果である出力データを出力する。本実施の形態では、出力部50は、当該出力データを、内部メモリ12または外部メモリ20に、当該畳み込み層の後段の層における入力データとして配置することで、出力データを出力してもよい。ここで、後段の層は、畳み込みニューラルネットワークにおける畳み込み層、プーリング層、または、正規化層である。
【0046】
図4A及び図4Bは、実施の形態に係る外部メモリ20における出力データの配置方法を示す図である。
【0047】
出力部50は、外部メモリ20に出力データを出力する場合には、図4Aに示すラスター状の形式で配置してもよいが、タイル状の形式で配置してもよい。ここで、ラスター状の形式とは、所定の領域において、出力データを構成する数値(成分)が、横1列に並べられ、かつ複数の行に並べるように配置された形式を意味する。また、タイル状の形式とは、所定の領域において、四角い形をした領域である四角領域が行列状に並べられ、個々の四角領域内では、出力データを構成する数値(成分)が、横1列に並べられ、かつ複数の行に並べるように配置された形式を意味する。
【0048】
なお、外部メモリ20に入力データを配置する場合も同様のことが言える。すなわち、外部メモリ20には、入力データがラスター状の形式で配置されてもよいし、タイル状の形式で配置されてもよい。
【0049】
また、出力部50が、外部メモリ20に出力データ及び入力データをタイル状の形式で配置する場合には、ラスター状の形式で配置する場合と比較して、行列積を演算する際にアクセスされる縦方向の効率が向上し、消費電力を抑制することができる。
【0050】
[演算システム1の動作]
以上のように構成された演算システム1の動作について説明する。
【0051】
図5は、実施の形態に係る演算システム1の動作概要を示すフローチャートである。図6は、図5に示すステップS3の動作詳細を示すフローチャートである。図7は、図5に示すステップS6の動作詳細を示すフローチャートである。
【0052】
まず、演算システム1は、入力データが所定のデータ量以下であるか否かを判定する(S1)。より具体的には、演算システム1は、演算処理対象となる畳み込み層ごとに、当該畳み込み層に入力される入力データが所定のデータ量以下であるか否かを判定する。
【0053】
ステップS1において、入力データが所定のデータ量以下である場合(S1でYes)、演算システム1は、第1の演算モードを選択し(S2)、第1の演算モードで、重みデータと入力データとの畳み込み演算を実行する(S3)。より具体的には、演算システム1は、ステップS1において、入力データが所定のデータ量以下であると判定し場合、第1の演算モードを選択して、第1の演算モードで畳み込み演算を実行する。ここで、より詳細な説明を図6を用いて行う。
【0054】
ステップS3において、図6に示すように、演算システム1は、まず、演算処理対象となる畳み込み層の重みデータを外部メモリ20に配置する(S31)。次いで、演算システム1は、演算処理対象となる畳み込み層への入力データを内部メモリ12に配置する(S32)。次いで、演算システム1は、外部メモリ20から重みデータの一部を、行または列ベクトルデータとして内部メモリ12に読み出す(S33)。本実施の形態では、演算システム1は、外部メモリ20から重みデータの一部を、行ベクトルデータとして内部メモリ12に読み出している。次いで、演算システム1は、内部メモリ12に配置された当該行または列ベクトルデータと、入力データの行列との行列積を演算する(S34)。本実施の形態では、演算システム1は、内部メモリ12に配置された当該行ベクトルデータと、入力データをサンプリングにより行列の形式にデータ変換した入力データの行列との行列積を演算している。次いで、演算システム1は、外部メモリ20に配置した重みデータの全てに対して、入力データの行列との行列積を演算済みか否か判定する(S35)。ステップS35において、重みデータの全てに対して演算済みの場合(S35でYes)、演算システム1は、ステップS3の処理を終了する。一方、ステップS35において、重みデータの全てに対して演算済みでない場合(S35でNo)、演算システム1は、ステップS33に戻る。そして、ステップS33において、外部メモリ20から、先ほど読み出した重みデータの一部と異なる重みデータの一部を、行または列ベクトルデータとして内部メモリ12に読み出し、ステップS34の処理を行う。
【0055】
以下図5に戻って説明を続ける。
【0056】
一方、ステップS1において、入力データが所定のデータ量より大きい場合(S1でNo)、演算システム1は、第2の演算モードを選択し(S5)、第2の演算モードで、重みデータと入力データとの畳み込み演算を実行する(S6)。より具体的には、演算システム1は、ステップS1において、入力データが所定のデータ量より大きいと判定した場合、第2の演算モードを選択して、第2の演算モードで畳み込み演算を実行する。ここで、より詳細な説明を、図7を用いて行う。
【0057】
ステップS6において、図7に示すように、演算システム1は、まず、演算処理対象となる畳み込み層への入力データを外部メモリ20に配置する(S61)。次いで、演算システム1は、演算処理対象となる畳み込み層の重みデータを内部メモリ12に配置する(S62)。次いで、演算システム1は、外部メモリ20から入力データの一部を、列または行ベクトルデータとして内部メモリ12に読み出す(S63)。本実施の形態では、演算システム1は、外部メモリ20から入力データの一部を、列ベクトルデータとして内部メモリ12に読み出している。次いで、演算システム1は、内部メモリ12に配置された重みデータの行列と、内部メモリ12に配置された当該列または行ベクトルデータとの行列積を演算する(S64)。本実施の形態では、演算システム1は、内部メモリ12に配置された重みデータの行列と、当該列ベクトルデータをサンプリングにより重みデータの行列の行成分数に合わせるようにデータ変換した列ベクトルデータとの行列積を演算している。次いで、演算システム1は、外部メモリ20に配置した入力データの全てに対して、重みデータの行列との行列積を演算済みか否か判定する(S65)。ステップS65において、入力データの全てに対して演算済みの場合(S65でYes)、演算システム1は、ステップS6の処理を終了する。一方、ステップS65において、入力データの全てに対して演算済みでない場合(S65でNo)、演算システム1は、ステップS63に戻る。そして、ステップS63において、外部メモリ20から、先ほど読み出した入力データの一部と異なる入力データの一部を、列または行ベクトルデータとして内部メモリ12に読み出し、ステップS64の処理を行う。
【0058】
以下図5に戻って説明を続ける。
【0059】
ステップS3またはステップS6の処理が終了すると、演算システム1は、出力データを出力する(S7)。より具体的には、演算システム1は、演算処理対象の畳み込み層における畳み込み演算を実行することにより得られた結果である出力データを、内部メモリ12または外部メモリ20に当該畳み込み層の後段の層への入力データとして配置する。
【0060】
[効果等]
図8及び図9は、実施の形態に係る第1の演算モードでの演算方法の効果を説明するための図である。図10は、実施の形態に係る第2の演算モードでの演算方法の効果を説明するための図である。図8図10において、同様の要素には同一の符号を付している。
【0061】
本実施の形態の演算方法によれば、演算処理対象となる畳み込み層への入力データが内部メモリ12に収まる場合と収まらない場合とで、制御を切り替えて入力データと重みデータのアクセス方法を逆にする。すなわち、本実施の形態の演算方法によれば、演算処理対象となる畳み込み層への入力データが内部メモリ12に収まる場合には、第1の演算モードで畳み込み演算を実行する制御を行う。一方、演算処理対象となる畳み込み層への入力データが内部メモリ12に収まらない場合には、第2の演算モードで畳み込み演算を実行する制御を行う。
【0062】
ここで、図8に示すように、第1の演算モードでの演算方法では、入力データが内部メモリ12に収まるので、入力データ全部を内部メモリ12に配置し、重みデータを外部メモリ20に配置する。入力データ全部と重みデータ全部とを同時に内部メモリ12に配置することができないからである。そして、入力データ全体を内部メモリ12から繰り返し読み出して積和演算部111に供給する。重みデータを、外部メモリ20から一部読み出して内部メモリ12の一部領域であるバッファに格納し、このバッファから積和演算部111へ繰り返し供給する。このようにして、重みデータ全体は、外部メモリ20から1回だけ読み出されるようにする。換言すれば、内部メモリ12に配置される入力データは全体を何回もループしながら読み出して使われる。一方、外部メモリ20に配置される重みデータは、全体を外部メモリ20から1回だけ読み出すことになるように、一部ずつ内部メモリ12のバッファに格納され、バッファを何回もループしながら使われることになる。なお、図8及び図9では、入力データ全体を内部メモリ12から繰り返し読み出したときに、読み出した入力データをサンプリングにより行列の形式にデータ変換して積和演算部111に供給している。内部メモリ12のバッファに格納された一部の重みデータとの行列積を演算するためである。
【0063】
また、図8に示す第1の演算モードでの演算方法では、内部メモリ12のバッファに、重みデータの一部が1以上の行ベクトルデータとして格納されて、行列積が演算されることから、出力データは横方向に生成されながら内部メモリ12に格納されている。なお、出力データが内部メモリ12に収まらない場合には、図9に示すように、外部メモリ20に出力すればよい。
【0064】
これにより、限られた容量の内部メモリ12であっても、消費電力の大きい外部メモリからの重みデータの読み出し回数を最小にすることができるので、消費電力をより抑制しながら畳み込み演算を行うことができる。
【0065】
また、図10に示すように、第2の演算モードでの演算方法では、入力データが内部メモリ12に収まらないので、入力データを外部メモリ20に配置し、重みデータの全部を内部メモリ12に配置する。入力データ全部と重みデータ全部とを同時に内部メモリ12に配置することができないからである。そして、入力データを、外部メモリ20から一部読み出して内部メモリ12の一部領域であるバッファに格納し、このバッファから積和演算部111へ繰り返し供給する。重みデータ全体を内部メモリ12から繰り返し読み出して積和演算部111に供給する。このようにして、入力データ全体は、外部メモリ20から1回だけ読み出されるようにする。換言すれば、内部メモリ12に配置される重みデータは全体を何回もループしながら読み出して使われる。一方、外部メモリ20に配置される入力データは、全体を外部メモリ20から1回だけ読み出すことになるように、一部ずつ内部メモリ12のバッファに格納され、バッファを何回もループしながら使われることになる。
【0066】
また、図10に示す第2の演算モードでの演算方法では、内部メモリ12のバッファに、入力データの一部が1以上の列ベクトルデータとして格納されて、行列積が演算されるので、出力データは縦方向に生成されながら内部メモリ12に格納されている。なお、出力データが内部メモリ12に収まらない場合には、外部メモリ20に出力すればよい。
【0067】
これにより、限られた容量の内部メモリ12であっても、消費電力の大きい外部メモリからの入力データの読み出し回数を最小にすることができるので、消費電力をより抑制しながら畳み込み演算を行うことができる。
【0068】
このように、入力データ及び出力データのサイズに制約を設けることなく、限られた容量の内部メモリ12で畳み込み演算を行うことができるので、大容量の内部メモリ12を備える場合と比較してコストダウンを図ることができる。
【0069】
以上のように本実施の形態の演算方法によれば、例えば数Mバイト以下といった限られた容量の内部メモリであっても、消費電力をより抑制しながら畳み込み演算を行うことができる。
【0070】
(変形例)
上記の実施の形態では、入力データが内部メモリ12に収まらない場合、入力データを外部メモリ20に配置し、重みデータの全部を内部メモリ12に配置するとして説明したが、これに限らない。内部メモリ12の容量(サイズ)によっては、重みデータの全部が配置できない場合も考えられる。以下の変形例では、実施の形態と同じ点は説明を省略し、異なる点を中心に説明する。
【0071】
本変形例の演算システム1では、上記の実施の形態の演算システム1と比較して、第2の演算モードにおいて重みデータの全部を内部メモリ12に配置することができないとする。これにより、制御部40の第2の演算モードの詳細動作が異なることになる。その他は、上記の実施の形態と同様である。
【0072】
[制御部40]
本変形例の制御部40は、上記の実施の形態と同様に、判定部30により入力データが所定のデータ量より大きいと判定された場合、第2の演算モードを選択して、第2の演算モードで畳み込み演算を実行する。
【0073】
より詳細には、制御部40は、まず、第2の演算モードを選択した場合、当該畳み込み層の入力データ及び重みデータを、回路10外部にある外部メモリ20に配置する。
【0074】
次に、制御部40は、外部メモリ20から、重みデータの一部を、1以上の行または列ベクトルデータである第1ベクトルデータとして内部メモリ12に配置する。そして、制御部40は、外部メモリ20から、入力データを、一部ずつ、1以上の列または行ベクトルデータとして内部メモリ12に読み出して、内部メモリ12に配置された第1ベクトルデータとの行列積演算を積和演算部111に行わせる。
【0075】
次に、制御部40は、外部メモリ20から、重みデータの当該一部と異なる一部を、1以上の行または列ベクトルデータである第2ベクトルデータとして内部メモリ12に配置する。続いて、制御部40は、外部メモリ20から、入力データを、一部ずつ、1以上の列または行ベクトルデータとして内部メモリ12に読み出して、内部メモリ12に配置された第2ベクトルデータとの行列積演算を積和演算部111に行わせる。
【0076】
なお、重みデータの全部を一旦外部メモリ20に配置する場合に限らない。重みデータの一部を内部メモリ12に配置し、重みデータの残りを外部メモリ20に配置してもよい。この場合、重みデータの一部のサイズ(容量)は、内部メモリ12に格納可能な最大限のサイズであればよい。
【0077】
これにより、制御部40は、重みデータを、全体として、外部メモリ20から内部メモリ12に一度だけ読み出すようにして、上記のような行列積演算を、重みデータの全てに対して行うことができる。
【0078】
[演算システム1の動作]
以上のように構成された本変形例の演算システム1の動作について説明する。本変形例に係る演算システム1の動作概要は、図5で説明した通りであるので説明を省略する。
【0079】
本変形例の演算システム1では、上記の実施の形態の演算システム1と比較して、図5のステップS6の詳細が異なる。以下、図11を用いて、本変形例に係るステップS6について説明する。
【0080】
図11は、変形例に係るステップS6の動作詳細を示すフローチャートである。
【0081】
ステップS6において、図11に示すように、本変形例に係る演算システム1は、まず、演算処理対象となる畳み込み層への入力データと重みデータとを外部メモリ20に配置する(S601)。
【0082】
次いで、本変形例に係る演算システム1は、外部メモリ20から、重みデータの一部を、1以上の行ベクトルデータとして内部メモリ12に読み出す(S602)。
【0083】
次いで、本変形例に係る演算システム1は、外部メモリ20から、入力データの一部を、1以上の列ベクトルデータとして内部メモリ12に読み出す(S603)。
【0084】
次いで、本変形例に係る演算システム1は、内部メモリ12に読み出した重みデータの一部である当該行ベクトルデータと、内部メモリ12に読み出した入力データの一部である当該列ベクトルデータとの行列積を演算する(S604)。本変形例では、演算システム1は、内部メモリ12に読み出した当該行ベクトルデータと、当該列ベクトルデータをサンプリングにより当該行ベクトルデータの行成分数に合わせるようにデータ変換した列ベクトルデータとの行列積を演算する。
【0085】
次いで、本変形例に係る演算システム1は、内部メモリ12に読み出した重みデータの一部である当該行ベクトルデータに対して、外部メモリ20に配置された全ての入力データで行列積を演算済みか否か判定する(S605)。
【0086】
ステップS605において演算済みでない場合(S605でNo)、本変形例に係る演算システム1は、ステップS603に戻り、外部メモリ20から、入力データの当該一部と異なる一部を、1以上の列ベクトルデータとして内部メモリ12に読み出す。そして、ステップS604の処理を行う。
【0087】
一方、ステップS605において演算済みの場合(S605でYes)、本変形例に係る演算システム1は、外部メモリ20に配置する全ての重みデータで行列積を演算済みか否か判定する(S606)。
【0088】
ステップS606において演算済みでない場合(S606でNo)、本変形例に係る演算システム1は、ステップS602に戻り、外部メモリ20から、重みデータの当該一部と異なる一部を、1以上の行ベクトルデータとして内部メモリ12に読み出す。そして、ステップS603以降の処理を行う。
【0089】
一方、ステップS606において演算済みの場合(S606でYes)、本変形例に係る演算システム1は、ステップS6の処理を終了する。
【0090】
このようにして、本変形例に係る演算システム1は、重みデータを、全体として、外部メモリ20から内部メモリ12に一度だけ読み出して、第2の演算モードでの畳み込み演算を実行する。
【0091】
なお、図11を用いて、重みデータを全体として内部メモリ12に一度だけ読み出して、第2の演算モードでの畳み込み演算を実行する場合の処理について説明したが、これに限らない。入力データを、全体として、外部メモリ20から内部メモリ12に一度だけ読み出して、第2の演算モードでの畳み込み演算を実行するとしてもよい。この場合、ステップS602で入力データの一部を列ベクトルデータとして読み出し、ステップS603で重みデータの一部を行ベクトルデータとして読み出せばよい。そして、ステップS605では列ベクトルデータに対して全ての重みデータで演算済みか否かを判定し、ステップS606では全ての入力データに対して演算済みか否かを判定すればよい。
【0092】
[効果等]
図12は、変形例に係る第2の演算モードでの演算方法の効果を説明するための図である。図10と同様の要素には同一の符号を付している。
【0093】
図12に示すように、第2の演算モードでの演算方法では、入力データが内部メモリ12に収まらないので、入力データを外部メモリ20に配置する。また、本変形例では、重みデータの全部も内部メモリ12に配置できないので、重みデータの一部を内部メモリ12に配置し、残りを外部メモリ20に配置する。このため、入力データを、外部メモリ20から一部読み出して内部メモリ12の一部領域であるバッファに格納し、このバッファから積和演算部111へ繰り返し供給する。同様に、重みデータの一部を、内部メモリ12から繰り返し読み出して積和演算部111に供給する。このようにして、入力データ全体または重みデータ全体が、外部メモリ20から1回だけ読み出されるようにすることができる。
【0094】
例えば、内部メモリ12と外部メモリ20に跨って配置される重みデータは全体を何回もループしながら読み出して使われてもよい。この場合、外部メモリ20に配置される入力データは、全体を外部メモリ20から1回だけ読み出すことになるように、一部ずつ内部メモリ12のバッファに格納され、バッファを何回もループしながら使われることになる。
【0095】
また、例えば、上述したように、内部メモリ12と外部メモリ20に跨って配置される入力データの全体を何回もループしながら読み出して使ってもよい。この場合、外部メモリ20に配置される重みデータは、全体を外部メモリ20から1回だけ読み出すことになるように、一部ずつ内部メモリ12のバッファに格納され、バッファを何回もループしながら使われることになる。
【0096】
図12に示す第2の演算モードでの演算方法では、内部メモリ12のバッファに、入力データの一部が1以上の列ベクトルデータとして格納されて、行列積が演算されるので、出力データは縦方向に生成されながら内部メモリ12に格納されている。なお、出力データが内部メモリ12に収まらない場合には、外部メモリ20に出力すればよい。
【0097】
これにより、限られた容量の内部メモリ12であっても、消費電力の大きい外部メモリからの入力データまたは重みデータの読み出し回数を最小にすることができるので、消費電力をより抑制しながら畳み込み演算を行うことができる。
【0098】
[その他の実施の形態等]
以上、本開示の態様に係る演算方法について、実施の形態に基づいて説明したが、本開示は、この実施の形態に限定されるものではない。例えば、本明細書において記載した構成要素を任意に組み合わせて、また、構成要素のいくつかを除外して実現される別の実施の形態を本開示の実施の形態としてもよい。また、上記実施の形態に対して本開示の主旨、すなわち、請求の範囲に記載される文言が示す意味を逸脱しない範囲で当業者が思いつく各種変形を施して得られる変形例も本開示に含まれる。
【0099】
また、以下に示す形態も、本開示の一つまたは複数の態様の範囲内に含まれてもよい。
【0100】
(1)上記の演算システムを構成する構成要素の一部は、マイクロプロセッサ、ROM、RAM、ハードディスクユニット、ディスプレイユニット、キーボード、マウスなどから構成されるコンピュータシステムであってもよい。前記RAMまたはハードディスクユニットには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムにしたがって動作することにより、その機能を達成する。ここでコンピュータプログラムは、所定の機能を達成するために、コンピュータに対する指令を示す命令コードが複数個組み合わされて構成されたものである。
【0101】
(2)上記の演算システムを構成する構成要素の一部は、1個のシステムLSI(Large Scale Integration:大規模集積回路)から構成されているとしてもよい。システムLSIは、複数の構成部を1個のチップ上に集積して製造された超多機能LSIであり、具体的には、マイクロプロセッサ、ROM、RAMなどを含んで構成されるコンピュータシステムである。前記RAMには、コンピュータプログラムが記憶されている。前記マイクロプロセッサが、前記コンピュータプログラムにしたがって動作することにより、システムLSIは、その機能を達成する。
【0102】
(3)上記の演算システムを構成する構成要素の一部は、各装置に脱着可能なICカードまたは単体のモジュールから構成されているとしてもよい。前記ICカードまたは前記モジュールは、マイクロプロセッサ、ROM、RAMなどから構成されるコンピュータシステムである。前記ICカードまたは前記モジュールは、上記の超多機能LSIを含むとしてもよい。マイクロプロセッサが、コンピュータプログラムにしたがって動作することにより、前記ICカードまたは前記モジュールは、その機能を達成する。このICカードまたはこのモジュールは、耐タンパ性を有するとしてもよい。
【0103】
(4)また、上記の演算システムを構成する構成要素の一部は、前記コンピュータプログラムまたは前記デジタル信号をコンピュータで読み取り可能な記録媒体、例えば、フレキシブルディスク、ハードディスク、CD-ROM、MO、DVD、DVD-ROM、DVD-RAM、BD(Blu-ray(登録商標) Disc)、半導体メモリなどに記録したものとしてもよい。また、これらの記録媒体に記録されている前記デジタル信号であるとしてもよい。
【0104】
また、上記の演算システムを構成する構成要素の一部は、前記コンピュータプログラムまたは前記デジタル信号を、電気通信回線、無線または有線通信回線、インターネットを代表とするネットワーク、データ放送等を経由して伝送するものとしてもよい。
【0105】
(5)本開示は、上記に示す方法であるとしてもよい。また、これらの方法をコンピュータにより実現するコンピュータプログラムであるとしてもよいし、前記コンピュータプログラムからなるデジタル信号であるとしてもよい。
【0106】
(6)また、本開示は、マイクロプロセッサとメモリを備えたコンピュータシステムであって、前記メモリは、上記コンピュータプログラムを記憶しており、前記マイクロプロセッサは、前記コンピュータプログラムにしたがって動作するとしてもよい。
【0107】
(7)また、前記プログラムまたは前記デジタル信号を前記記録媒体に記録して移送することにより、または前記プログラムまたは前記デジタル信号を、前記ネットワーク等を経由して移送することにより、独立した他のコンピュータシステムにより実施するとしてもよい。
【0108】
(8)上記実施の形態及び上記変形例をそれぞれ組み合わせるとしてもよい。
【産業上の利用可能性】
【0109】
本開示は、演算方法に利用でき、特に、画像認識を行う大規模な畳み込みニューラルネットワークの畳み込み層の畳み込み演算を低消費電力で処理する方法及び回路技術として用いられる演算方法に利用できる。
【符号の説明】
【0110】
1 演算システム
10 回路
11 演算器
12 内部メモリ
20 外部メモリ
30 判定部
40 制御部
50 出力部
60 畳み込みニューラルネットワーク
111 積和演算部
112 データ変換部
図1
図2
図3A
図3B
図4A
図4B
図5
図6
図7
図8
図9
図10
図11
図12