セミコンポータル
半導体・FPD・液晶・製造装置・材料・設計のポータルサイト
セミコンポータル

ニューロチップ概説 〜いよいよ半導体の出番(2-3)

|

第2章:ディープ・ニューラルネットワークのニューロチップへの実装〜その勘所は!!
この第2章の最後に当たる2-3では、ニューラルネットワークをチップに実装する場合のメモリの規模がどの程度になるか、さらにメモリ規模を減らすための工夫などを紹介する。(セミコンポータル編集室)

著者: 元半導体理工学研究センター(STARC)/元東芝 百瀬 啓

2.7  ディープ・ニューラルネットワーク 〜メモリ実装に関する考察: 3つのタイプ〜
本節では、CNN以外も含めニューラルネットワークの構成の型が3つに分けられることを説明し、各々の型のパラメータ数、すなわちメモリの規模が条件によりどのように変わるのかに着目する。その理解を通して、LSIへのメモリの実装の勘所を掴む。その中で、目安の意味も含めてオンチップ(混載)を一つの議論のポイントとする。なお、オンチップメモリ(SRAM)と外付けメモリ(DRAM)ではパワー、速度共に2桁程度異なる(参考資料13)。

(1) 3つのタイプに分けられる
図13に公知の各種ネットワークもしくはモデルの処理対象入力数(画像および単純データ)と必要パラメータ数との関係を示した。CNN以外のアルゴリズム、さらにはアプリケーションへの適応をにらんだ実ネットワークの値も入れた。またパラメータ当たりのビット数を16ビットとし、バイト換算した量を右軸に写した。必要なメモリ容量(Byte=8bit)である。各データポイントにネット名もしくはモデル名を付記した(必要な場合には参考文献を参照)。さらに主にCNNに対してはクラス数を加えた(例えばC10(Classが10))。AlexNet、VGGNet等のモデルのクラス数は1000である。


図13 入力数と必要メモリ容量の関係

図13 入力数と必要メモリ容量の関係
Googleの猫(参考資料33:教師なし学習)、2016自動(自動運転 参考資料34)、Deep Q-Learning(
参考資料35)、Autoencoder(マルチモーダル:参考資料36)、DaDianNao(Super Leaning Machine Chip:参考資料37)。 注意点:C型はConv層がモジュール化されていることが特徴。


ネットワークの構成の型として、前節までに紹介したCF型、C型に新たにF型を加えた。F型は結合が全結合もしくは、畳込み層でも非共通パラメータ型(重み共有weight sharingされていない)のネットワークを指す。教師なし学習で著名なグーグルの猫のネットが該当する。この形のネットワークをDNN (Deep Neural Net) とCNNと区別するために使用する場合があり図でも使用した。

横軸はニューラルネットが1度にタスク処理をする入力数である。この図の範囲でCNNの場合には画素、DNN (F型) の場合には、画素に加えて音声、データ(角度、スピード等)も含まれる。使用したDeep Q-Learning (深層強化学習のひとつ)の場合にはデータのみである。通常論文等の発表ではパラメータはあからさまに記載しないので、半分程度は著者が試算した値である。参考資料14も参考にした。

(2) 各々の型の特徴
ネットの構成の型ごとに内容を説明する
2-1) F型(全結合主体型)〜教師なし学習DNN、マルチモーダルAutoencoder、強化学習D QL)
現時点では、画像の教師なし学習、複数種のデータを同時処理するマルチモーダル、再帰型RNN、さらには強化学習が全結合(Fully Connected)が主体のF型となるようだ。全結合層が主体なので、入力次元数に対して、2乗でパラメータが必要となる。教師なしでの画像認識だとパラメータ数が急増するので対策が必要である。これに対して、今回使用したDeep Q-learning(深層強化学習)では、そもそも画像データを扱っていない。速度、位置といったデータであり量的には少ない。RNNなり強化学習で画像情報を扱う際は、知る範囲では事前にCNNでデータを抽象化(例えば位置とか速度に変換)して、入力次元数を落とすのが通常である。

2-2)CF型(CNN 畳込み層+全結合層共存型):教師あり画像認識が代表
入力数の2乗に比例してパラメータ数は増加し赤い実線上に載る。224x224と解像度の大きめ画像の場合と32x32と小さい画像の場合が主にプロットされている。クラス数はそれぞれ1000と10と極端に違う。赤い実線に乗るとするならば、ネットワークが最適化されると「入力数(X)とクラス数(C)の比は一定値に落ち着く」ことを意味する。X/C=100の意味するところは「1クラス当たり10x10の画素が必要」との解釈もできる。この原理の究明は今後の課題である。図の青い○で示したClass10のネットワークは赤い実線よりも下側にプロットされている。クラス数に対して過剰の解像度を持った入力画像を使用していると考えられる。この結果のひとつはNVIDIAの自動運転(End to end learning for Self-Driving Cars:参考資料34)に使用されているネットワークである。何か他の意図があるのかもしれない。なお、システムの内容は第3章以降で説明する。

2-3)C型(CNN 畳込み層主体): モジュール化
Class1000のGoogLeNet22とResNet34/152を図13に加えてある。解像度が低いケースは、前節で紹介したMSRAのResNet110 (110層) のCIFAR-10 (3x32x32) でのベンチマークの結果をプロットした。さらに参考資料14に載っていた以下の3つのモデルを図13に入れてある。それらはAll-CNN(参考資料54)、Hex Kernel(参考資料55)、そしてNiN (Network in Network) のCIFAR版である。パラメータ数は100〜170万個と3x32x32の解像度にしてはかなり多い。強引に結ぶと(桃色の薄い線)と傾きが1でパラメータと解像度は比例関係にある。かなり乱暴だが、畳込み層の場合には、入力の注目画素(群)の近傍での特徴抽出の積み重ねなので、あながち入力の次元数に比例するとみるのも間違ってはいない。この正しい関係と原理の究明も今後の課題である。

まとめるとパラメータ数(y)は入力数(x)に対して、それぞれの型式で
F型(全結合層型) ・・・ y=x2
CF型(共存型) ・・・ y=x2/100
C型(畳込み層型) ・・・ y∝x  (ただし、モジュール化)

(3) メモリの実装に関する考察
図13の右軸に中国科学院CASが2014年末に発表したDaDianNaoの混載DRAM搭載量を示した。256Mビット(8.2mm角)、32Mバイトである。2014年8月発表のIBMのTrueNorthも同じくSRAMの混載で容量は256Mビット(25x17mm2)である。共に28nmでの混載であることから当面の目安になる。

3-1) F型(全結合型)
全結合主体であることからメモリへのアクセスが頻繁に行われる。メモリの混載は極めて効果的である。しかし256Mビット/32Mバイトを混載の目安とすると、画像応用では規模的にかなりかけ離れている。画像を扱う際には革新的な技術が待望される。

3-2) CF型(共存型)
入力の画素数は余裕を持たせると100x100〜150x150画素程度がメモリ混載の限界と考えられる。共存型とは言え、全結合部が性能の90%前後を占めることから混載した際の消費電力、スピード改善の効果は大きい。メモリアクセスへの配慮が重要である。

3-3) C型(畳込み主体型)
入力の画素数が3x224x224(1000クラス)並みのネットワークもメモリ混載が射程内に入ってきた。尚、畳込み層では同じパラメータを繰り返し使用する事から(平均200回程度、2.6節で説明)メモリへのアクセスは工夫により大幅に軽減される。エッジ・モバイル系へのディープラーニングの適用がかなり現実的になって来た。その上で、どの程度低消費電力化を追求するかがポイントとなる。

(4) ResNet34をLSIに実装してみる
少し図13から離れて、LSIに実装した際にどのようになるか簡単に試算してみる(表3の16ビットのケース)。モデルは昨年末の発表から最近(2016年7月時点)までの半年間でかなりの追検証・展開検証実績報告(物体検知、Recurrent NNとの複合/他機関報告含め:参考資料29)のあるResNet、層数としては手頃な34層を選択した。表1より必要なメモリの規模としては、352Mビット(パラメータ当たり16ビット)が必要である。現時点では前述のTrueNorth/DaDianNaoクラスの256Mビットが混載の実績とするとそれより大きく、今後の微細化を前提としても余裕があるとは言えない。しかし、エッジ応用を考えるとメモリ実装にかなりの自由度が出たと考えることができる。性能に関しては、あくまで単純試算だが、36.4億回のMAC演算が必要であることから3.64msecで1画像(フレーム)の認識処理が可能なレベルである(16ビット化で速くなるが考慮せず)。仮に10倍遅くても36msecで30fps(frame per sec)には対応できるレベルである。ちなみに前提として1TFLOPS/s(MAC換算)を使用したが、かなりレベルが高い。

ResNet等C型のCNNの登場によりエッジ系はもとよりかなりモバイルへの展開が現実味を帯びてきた。なお、システム応用の場合には入力の解像度、並列タスク数、パラメータのビット数、層数(34層でいいのか?)、クラス数、エラーの許容範囲、連続で処理する複合機能等、システム構成の情報を加味する必要がある。第3章以降で具体的な例を用いて可能な限りシステムイメージに迫る予定である。


表3 メモリ容量と演算時間の単純試算

表3 メモリ容量と演算時間の単純試算


2.8  ディープ・ニューラルネットワーク 〜メモリ量激減 サブ0.1Wも! モバイルにロックオン〜
(1) パラメータ・データ低ビット化/圧縮の動きとその効果
表4に最近のメモリ量削減に直結するパラメータ・データ低ビット化/圧縮の動向を一覧として示す。パラメータ・データは通常は、32ビットの浮動小数点演算をベースに研究開発、大手IT企業のデータセンターでの実用が進められている。しかし、ほとんどのこの分野に関わる方は32ビットもいらないのではと思う(特に実行時は)。32ビットと高精度化することと、特徴抽出の際に対象を抽象化(不要な物をそぎ落として)することが逆行しているからである。

振り返ると2012年以前より固定整数、8ビット化の検討等がなされていた(参考資料38)。2013〜2014年にはフィルタを行と列に分割して実行時の計算量を2〜3倍程度削減するSeparable Filter (参考資料39、ニューヨーク大学とFacebook AI Researchの報告)などのネットの圧縮法の報告があった。さらに2014年にもコロンビア大学のSoudryらの重みを±1とする手法(Expectation Backpropagation:参考資料40) 等の報告もあった。しかし、表4に示すように昨年の11月(昨年12月のNIPS)のBinary Connectの発表 (参考資料41) の頃より直近の課題としてより注目され出し、またLSI実装に近い形での発表も増えてきた。特筆すべきは各発表が、エッジの中でも搭載が遅いだろうと想定されていたモバイル機器への大規模ネットワークの搭載を身近な物としてうたっている点である(Googleも同様にモバイルを指向。しかしまずは、直近の課題であるデータセンターでの実際の運用が先と思われる)。

パラメータ・データの低ビット化/圧縮の効果は、高速化と同時に消費電力も改善され、2乗の効果があり極めて魅力的である。さらにうまく行けばSRAMのオンチップ化も可能となり良いことばかりである。認識率の低下が懸念されるが、CNN等で見る限りはぼぼ無いかもしくは小さいとの結果が報告されている。


表4 パラメータ・データの低ビット化/圧縮の動向

表4 パラメータ・データの低ビット化/圧縮の動向


(2) 低ビット化/圧縮方法の分類
各技術の詳細を述べる。表4のパラメータ・データの低ビット化/圧縮は3つに分類される。

2-1) バイナリー化(1ビット化):
±1の2値(1ビット)で演算を行う。バイナリーコネクトではパラメータだけを、バイナライズトネットワークでは加えてバッチ・ノーマライゼーション後の出力値を2値化する。なお、精度が必要な学習時誤差逆伝播法のパラメータ微調時は、保持しているパラメータの実数を使用して値を更新する。MNIST/CIFAR(ベンチマークの種類)への適用で良い結果が得られており、今後はImagenet等の大規模画像での検証を行う等展開の幅を広げるとのこと(2016年4月:参考資料42)である。後者と似た方法をIBMがTrueNorthのチップアーキテクチャに適用して、懸案であった深層学習からスパイキングニューラルネットワークへ橋を架けることに成功している。深層学習での成果をスパイキングニューラルネットワークに焼き直しニューロモルフィックアーキテクチャ上で実行できる。同じく現時点ではMNIST/CIFAR(CNN)への適応である。詳細は第3章で説明予定である。

2-2) パラメータの圧縮(Deep Compression):
パラメータの圧縮を学習から実行にかけて表の3つの施策を用いて行う。効果は大きい。複雑すぎて可視性が悪いとの指摘も受けている。また、C型(畳込み層主体)のCNNモデルへの適用結果が待たれる等、技術の柔軟性がどの程度あるかを知りたい。

2-3) ビット数の削減(量子化):
演算(積和演算、活性化演算、プーリング、正規化ほか)だけを8ビット整数(0-255)で処理する。ユーザーは従来通り32ビット浮動小数点演算のライブラリーがほぼそのまま使える(と理解している)。入力側と出力側でデータの量子化(32→8ビット)と反量子化を行うが、変換時のラウンド処理の取り扱いで注意が必要のようである。2-1)〜2-3)とも共通にハードも最適化しないと100%の効果が引き出せない。1〜2年掛けてTPU (Tensor Processing Unit)なるカスタムチップを開発したことをGoogleが5月に公表した。データ・パラメータの低ビット化の効果はオーバーヘッド分があり、速度(サイクル数)改善およびメモリ量削減は各々3〜4倍と推測する。パワーも同様で、結果パワー効率改善としては10倍程度となる。一般ユーザーは知らないうちに、8ビット整数処理のディープラーニングをしていることになる。もちろん、精度は落ちないことが前提である。Googleにとってはデータセンターのディープラーニング実行コストが1/3〜1/4になり、かなりのインパクトと予想する。パワーも減る。このタイミングでのビット数の削減の施策の展開は、第1章冒頭で述べたように、「ディープラーニングのモデルライブラリーへの展開すなわちデータセンター展開の指数関数的勢い」を支えるための喫緊の課題とみることも出来る。

その他、表4に示すように入力・中間データの外部メモリとの転送時にロスレス圧縮を使う技術の報告がISSCC2016でMIT/NVIDIAからあった(参考資料48)。ハードの変更は必要で、効果は小さいが確実である。

(3) モバイルへの実装の可能性は?!
Googleの動きに見られるように、既に実行フェーズでは整数8ビットは認知されつつある。4倍弱の改善は確実、さらに低ビット化が進めば改善は32倍まで期待できる。今後、大雑把に10倍程度の
パラメータの低ビット化/圧縮がなされると仮定して、どの程度LSI実装に効果があるのかResNet34(22.0Mパラメータ)を使用して試算してみる。

3-1) 必要メモリ面積は?
前節に使用した表3の最右列(ピンク色の枠)に値を加えてある。32ビットに対して1/10の効果とすると、端数で現実的ではないが3.2ビット/パラメータとなる。総メモリビット数は、22Mx3.2=71.4Mビット。最近公表されている情報(参考資料49)から、SRAMのオンチップでの面積は、7Mbit/mm2 @16nm とする。必要エリア面積は10mm2@16nm (3mm角強のサイズ)となる。(152層のResNet152だと56Mパラメータで、25.5mm2となる。これだとさすがに大きい)。ResNet34だとかなりの余裕を持ってSRAMのオンチップメモリ化(混載)が可能となる。結果、図13の左の軸の22Mパラメータ以下(ほとんどe-DRAM DaDianNaoのラインの少し上)の領域はカバーできる。残るのは、かなり大きな解像度の物(大画面)、もしくはマルチタスク処理、教師なし学習等となる。

3-2) 積和演算のパワーはどのくらいのレベル?
モバイル搭載を考えると気になる点だ!同様に、Imagenetの画像認識を30 frames/secで行った場合のパワーを試算してみた。条件は前節で使ったものと同じで、LSIとしては1TFLOPS/Wの性能が出せることを前提としている。同じく表3にまとめた。32ビットに対して、その10分の1の処理量で良いので1/10の消費電力、100mWとする。3.6msecで1画像フレームの認識が終わるので次のフレームが来る30msec程はスタンバイ状態になる。単純に1/10の稼働率と考えると、10mW程度の積和演算消費パワーとなる。オンチップSRAMのパワー等々を加えると、もう少し増える。しかし依然かなりのローパワーでモバイルへの搭載も十分可能なレベルである(なお1TFLOPS/Wがかなり厳しいが)ことがわかる。

まだ、いくつかの課題もあるが、SRAMオンチップでサブ0.1W程度は見込める状況と考えられる。エッジ系はもとより、モバイル系も射程内でロックオンされている状態である。パラメータ・データの低ビット化/圧縮に関して本節のいくつかを第3章で少し踏み込み紹介する。

まとめ
今後のCNNのモデルの進化に関しては、NiN、GoogLeNet、およびResNetがもたらしたモジュール形式の改良で進んで行くと考えたい。ここ半年ほどの間に総括的なSqueeze Net(参考資料50)、ENet(参考資料52)なるモデルの発表もある。今年のImageNet(9月〜10月)およびNIPS(12月)で今後どのような進化の方向性を示すのか興味深い。そのようなネットワークモデルの進化と収束の流れに加えて、実際のアプリケーションにどのモデルをどのように使用するのかといった実践的、包括的かつ教示的な話も今後出てくると予想している。入力の次元数と出力のクラス数、そして許容誤差範囲も絡んでくると考える。参考資料51の著者(Purdue大のEugenio Culurciello教授、TeraDeep社のCTOでLeCun氏の教え子)はまとめることを示唆しているので期待したい。

LSI化の勘所として、詳細を見極めるまでには至っていないが、ある程度の方向性を本章で述べた。
 ・高性能化と複合機能化(システム化)・・・2つの大きな流れ
 ・基本構成(畳込み層、全結合層、活性化関数、プーリング・・・、学習時の技法)は収束へ
 ・モデルの進化(CF型からC型への移行)・・・C型が主流になりつつある
 ・C型のモジュールが重要
 ・層数とエラー率改善(ディープ化へ)・・・100層以上可能
 ・積和演算数とパラメータ数(メモリ)の関係・・・200〜300倍
 ・モデルのタイプ(F,CF,C型)と演算数・パラメータとの関係
 ・パラメータ・データの低ビット化/圧縮の動向・・・ここ半年で進化
 ・エッジ・モバイル系への適用の可能性・・・射程内でロックオン

本章の最後に補足する。LSIの実装的な分野で、MIT、Stanford大学、そしてUCB等の活動が活発である。その中にデジタルLSIの設計分野で著名なStanford大学のHorowitz教授のグループも名を連ねており(参考資料46, 53, 13)注目される。それにも増して、かなりの頻度で大学の論文にNVIDIAが名を連ねている(ハードのGPUとソフトCuDNN等のSDKのサポート)点が気になる。次章以降、本章の論点を踏まえ、ディープラーニングLSIの回路アーキテクチャおよび実応用システムへの実装に迫る。

(2016/08/10)

参考資料 (1〜32までは前回以前)
  1. Q. V. Le, and A. Y. Ng., "Building High-level Features Using Large Scale Unsupervised Learning", In International Conference on Machine Learning, June 2012. 20120626. グーグルの猫.
  2. Mariusz Bojarski+, "End to End Learning for Self-Driving Cars", 2016年4月25日. 2016ADAS(図13), CNNによる自動運転.
  3. 松元 叡一, 「分散深層強化学習でロボット制御」, Preferred Research (Preferred Infrastructure Inc,), 2015年6月10日 (再掲:図13のパラメータ値は筆者の試算値)
  4. Noda, , Hiroaki Arie , Yuki Suga , Tetsuya Ogata, "Multimodal integration learning of robot behavior using deep neural networks", Robotics and Autonomous Systems, Volume62, Issue6, 721-736頁, 2014年6月. マルチモーダル
  5. Yunji Chen, Tao Luo1,3, Shaoli Liu1, Shijin Zhang1, Liqiang He2,4, Jia Wang1, Ling Li1, Tianshi Chen1, Zhiwei Xu1, Ninghui Sun1, Olivier Temam2, "DaDianNao: A Machine-Learning Supercomputer", in Proceedings of the 47th IEEE/ACM International Symposium on Microarchitecture(MICRO’14), IEEE, 2014. DaDianNao、20141213.
  6. Vincent Vanhoucke, Andrew Senior, Mark Z. Mao, "Improving the speed of neural networks on CPUs", 初期の低ビット化検討の論文
  7. Emily Denton, Wojciech Zaremba, Joan Bruna, Yann LeCun, Rob Fergus, "Exploiting Linear Structure Within Convolutional Networks for Efficient Evaluation", 2014年6月9日. Separable Filter.
  8. Daniel Soudry, Itay Hubara, Ron Meir, "Expectation Backpropagation: Parameter-Free Training of Multilayer Neural Networks with Continuous or Discrete Weights", 2014年12月, ニューロンと負荷を±1(Binary化).
  9. Matthieu Courbariaux, Yoshua Bengio, Jean-Pierre David, "BinaryConnect: Training Deep Neural Networks with binary weights during propagations", 2016年4月18日(ver3). Binary Connect.
  10. Matthieu Courbariaux, Itay Hubara, Daniel Soudry, Ran El-Yaniv, Yoshua Bengio, "Binarized Neural Networks: Training Deep Neural Networks with Weights and Activations Constrained to +1 or -1", 2016年3月13日(v3). Binarized NN
  11. Steve K. Esser, Rathinakumar Appuswamy, Paul Merolla, John V. Arthur, and Dharmendra S. Modha, "Backpropagation for Energy-Efficient Neuromorphic Computing", Advances in Neural Information Processing Systems 28 (NIPS 2015), 2015年12月NIPS2015.SNNへBP適用.
  12. Steven K. Esser, Paul A. Merolla, John V. Arthur, Andrew S. Cassidy, Rathinakumar Appuswamy, Alexander Andreopoulos, David J. Berg, Jeffrey L. McKinstry, Timothy Melano, Davis R. Barch, Carmelo di Nolfo, Pallab Datta, Arnon Amir, Brian Taba, Myron D. Flickner, Dharmendra S. Modha, "Convolutional Networks for Fast, Energy-Efficient Neuromorphic Computing", 2016年5月24日(V2).スパイキングNNへのCNN/BP応用.
  13. Song Han, Huizi Mao, William J. Dally, "Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding", 2016年2月15日(V5).Deep Compression.
  14. Song Han, Xingyu Liu, Huizi Mao, Jing Pu, Ardavan Pedram, Mark A. Horowitz, William J. Dally, "EIE: Efficient Inference Engine on Compressed Deep Neural Network", 2016年5月3日(V2). Deep Compression IP化.
  15. Pete Warden, "How to quantize Neural Networks with TensorFlow", ブログ, 2016年5月3日, 演算の量子化(32bit→8bit)
  16. Yu-Hsin Chen, Tushar Krishna, Joel Emer, Vivienne Sze, "Eyeriss: An Energy-Efficient Reconfigurable Accelerator for Deep Convolutional Neural Networks", 2016 IEEE International Solid-State Circuits Conference, Session 14.5, p262-264, 2016年2月 Eyeriss CNNの最適回路(ISSCC2016)
  17. 日経テクノロジーオンライン "ルネサス、16nmFinFET向けデュアルポート埋込みSRAMを開発", 2015年12月8日. SRAMの面積
  18. Forrest N. Iandola, Song Han, Matthew W. Moskewicz, Khalid Ashraf, William J. Dally, Kurt Keutzer, "SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and &llt;0.5MB model size", 2016年4月6日(V3), Squeeze Net.
  19. Eugenio Culurciello, "Neural Network Architectures", ブログ, 2016年6月4日 再掲, Neural Network Architectureのサマリ.
  20. Adam Paszke, Abhishek Chaurasia, Sangpil Kim, Eugenio Culurciello, "ENet: A Deep Neural Network Architecture for Real-Time Semantic Segmentation", ENet, 2016年6月7日. リアルタイムのSemantic Segmentation.
  21. Xuan Yang, Jing Pu, Blaine Burton Rister, Nikhil Bhagdikar, Stephen Richardson, Shahar Kvatinsky, Jonathan Ragan-Kelley, Ardavan Pedram, Mark Horowitz, "A Systematic Approach to Blocking Convolutional Neural Networks", 2016年6月14日. スタンフォード大学 ホロビッツ教授関連.
  22. Jost Tobias Springenberg, Alexey Dosovitskiy, Thomas Brox, Martin Riedmiller, "Striving for Simplicity: The All Convolutional Net", 2014年12月21日. All-CNN(C型)
  23. Zhun Sun, Mete Ozay, Takayuki Okatani, "Design of Kernels in Convolutional Neural Networks for Image Classification", 2015年11月30日. Hex Kernels(C型).

月別アーカイブ

Copyright(C)2001-2024 Semiconductor Portal Inc., All Rights Reserved.