Learning to Generate Reviews and Discovering Sentiment

تغییرات پروژه از تاریخ 1396/11/21 تا حالا
[لینک مقاله](https://arxiv.org/abs/1704.01444)
[لینک پیاده سازی](https://github.com/openai/generating-reviews-discovering-sentiment)
**1. یادگیری برای ایجاد نظرات و کشف احساسات**
**چکیده**
در این مقاله خواص مدل های مکرر byte-level بررسی شده است. هنگامی که مقدار کافی ظرفیت، داده های آموزشی و زمان محاسبه داده می شود، بازنمودهایی که توسط این مدل ها آموخته می شود، شامل ویژگی های غیرمتعارف مربوط به مفاهیم سطح بالا می باشد. به طور خاص، یک واحد را انتخاب کرده که تجزیه و تحلیل احساسات را انجام می دهد. این بازنمودها، به شیوه ای بدون نظارت، برای به دست آوردن وضعیت در زیر مجموعه دوتایی Treebank احساسات استندفورد آموخته شده است. آنها همچنین بسیار کارآمد هستند. هنگام استفاده از تعداد انگشت شماری از نمونه های برچسب شده، رویکرد مقاله با عملکرد پایه های قوی که در مجموعه داده های کامل آموزش دیده است، مطابقت دارد. همچنین نشان داده شده که واحد احساسات تأثیر مستقیم بر روند تولید مدل دارد. 
**1.1 مقدمه و انگیزه کار**
یادگیری نقش مهمی در بسیاری از سیستم های یادگیری ماشین مدرن ایفا می کند. نمایش داده های خام را به فرم های مفید تر و انتخاب مدل نمایش جزء مهم هر برنامه می باشد. به طور کلی، دو حوزه تحقیقاتی وجود دارد که بر جزئیات متفاوتی از نحوه یادآوری های مفید یاد می شود.
همچنین سابقه ای طولانی در یادگیری بازنمایی بدون نظارت وجود دارد [1]. بسیاری از تحقیقات اولیه در مورد یادگیری عمیق مدرن از طریق این رویکرد توسعه داده شده و معتبر بوده است. یادگیری بدون نظارت به دلیل کارا بودن در زیر مجموعه ها و حوزه های داده ای که می تواند به وسیله منابع، حریم خصوصی یا سایر محدودیت ها پاک شود و برچسب گذاری شود، روش امیدوار کننده ای است. در حالی که رویکردهای با نظارت دارای اهداف مشخص است که می توانند به طور مستقیم بهینه سازی شوند، رویکردهای با نظارت بر وظایف پروکسی نظیر بازسازی، برآورد تراکم تکیه می‌کند که مستقیما بازنمایی های مفید برای وظایف خاص را ایجاد نمی کنند. در نتیجه، کارهای زیادی به منظور طراحی اهداف، معماری ها و.. به منظور تولید یادگیری بازنمایی های مفید انجام شده است. 
با وجود این مشکلات، برنامه های قابل توجهی از یادگیری بدون نظارت وجود دارد. بردارهای کلمه پیش آموزش یافته بخش مهمی از بسیاری از سیستم های مدرن هستند. این بازنمودهایی که توسط مدل سازی همزمان رویدادهای کلمه مورد استفاده قرار می گیرند، قابلیت رفع اطلاعات و قابلیت تعمیم پذیری سیستم های NLP را افزایش می دهند مدل سازی موضوع همچنین می تواند عوامل را در یک متن متناسب با مفاهیم تفسیری انسان مانند هنر یا آموزش کشف کند .
چگونگی یادآوری عبارات، احکام و اسناد، یک حوزه باز از تحقیقات است. با الهام از موفقیت بردارهای کلمات، [2] پیشنهاد یک بردار skip-thought، که یک روش آموزش رمزگذار جملات با پیش بینی جمله قبل و بعد است را دادند. بازنمایی که توسط این هدف شناخته می شود، بر روی مجموعه وسیعی از وظایف ارزیابی رقابت می کند. تکنیک های پیشرفته تر مانند نرمال سازی لایه در [3] نتایج را را بهبود می بخشد. با این حال، بردارهای skip-thought هنوز با مدل های نظارت شده که مستقیما به منظور سنجش عملکرد مطلوب در یک مجموعه داده خاص، بهینه شده اند، بهتر عمل می کنند. این مورد برای هر دو وظیفه طبقه بندی متن است که اندازه گیری می کند که آیا یک مفهوم خاص به خوبی در بازنمایی کد گذاری شده است. [4]  بر خلاف بازنمایی آموزشی عمومی در یک مجموعه داده بزرگ و سپس ارزیابی بر روی سایر وظایف / مجموعه داده ها، با استفاده از اهداف نظارتی مشابه نظیر رمزگذاری خودکار و مدل سازی زبان برای اولین بار از یک مدل در یک مجموعه داده استفاده کرد و سپس آن را محاسبه کرد برای یک کار خاص این رویکرد آموزش مدل مشابهی را از ابتدایی تصادفی و پیشرفت هنر بر روی چندین مجموعه داده های طبقه بندی کرد. ترکیبی از مدل سازی زبان با مدل سازی موضوع و اتصالات کوچک برداشت شده از ویژگی های تحت نظارت در بالا نیز نتایج قوی در تجزیه و تحلیل احساسات در دامنه به دست آورد [5].
با توجه به این، فرض شده است که دو اثر ممکن است ترکیبی باشد که منجر به عملکرد ضعیف رویکردهای صرفا بدون نظارت شود. بردارهای پرش بر روی یک کتاب آموزش داده شدند. اما برخی از وظایف طبقه بندی که در آنها ارزیابی می شود، مانند تحلیل احساسات بررسی کالاهای مصرفی، خیلی متناقض با متن رمان نیست. در این مقاله این مسئله توزیع را پیشنهاد کرده اند، همراه با ظرفیت محدود مدل های فعلی، نتایج زیر را به بازنمایی ارائه می کنند.
در این کار، بر روی وظیفه تحلیل احساسات تمرکز شده و تلاش کرده اند تا نمایشی بی نظیر را که دقیقا شامل این مفهوم است یاد بگیرند.  [6] نشان داد که مدل سازی مجدد زبان در سطح کلمه، یادگیری لغت نامه های مفیدی را پشتیبانی می کند و در این مقاله این خط کار مورد توجه قرار گرفته است. به عنوان یک رویکرد، در معیار سنجش محبوبیت مدل سازی زبان شخصیتی با توجه به سادگی و کلیت بیشتر آن را در نظر کرفته اند. همچنین در طیف وسیعی از وظایف برای سنجش میزان حساس بودن بازنویسی آموخته شده به مقادیر مختلف داده ها و وظایف خارج از حوزه را مورد سنجش قرار داده اند. 
**2.1. مجموعه داده**
کارهای قبلی در زمینه مدل سازی زبان بر روی داده های نسبتا کوچک اما رقابتی مانند [7] و جایزه Hutter در ویکی پدیا [8] ارزیابی شده است. همانطور که در [9] مورد بحث قرار گرفت. 
عملکرد در این مجموعه داده ها عمدتا تحت کنترل است. از آنجایی که در این مقاله علاقه مند به بازنویسی احساسات با کیفیت بالا هستند، مجموعه داده های بازبینی محصولات آمازون را که در [10] معرفی شده اند را به عنوان یک واحد آموزشی انتخاب کرده اند. در نسخه ناقص، این مجموعه داده حاوی بیش از 82 میلیون بررسی محصول از ماه مه سال 1996 تا جولای 2014 به بیش از 38 میلیارد بایت تمرین است. با توجه به اندازه مجموعه داده، ابتدا آنرا به 1000 عدد تقسیم کرده ایم که شامل تعداد مشابهی از بررسی ها و 1 عدد برای اعتبار سنجی و 1 عدد برای آزمون است.
**3.1. مدل و جزئیات آموزشی**
بسیاری از معماری ها و تنظیمات hyperparameter ها در آزمایش های اولیه در مجموعه داده ها مورد توجه قرار گرفتند. با توجه به اندازه مجموعه داده ها، جستجوی فضای گسترده ای از پیکربندی های احتمالی بسیار پرهزینه است. برای کاهش آن، ما عملکرد نسبی مدل های نامزد کوچکتر را پس از یک بار گذر از طریق مجموعه داده ها ارزیابی کردیم. مدل انتخاب شده برای آزمایش بزرگ مقیاس یک LSTM چند لایه تک لایه [11] با 4096 واحد است. ما LSTM های متحرک را برای همگرا شدن سریع تر از LSTM های معمولی برای تنظیمات hyperparameter که از لحاظ داده ها و ساعت دیواری مورد بررسی قرار گرفتند، مشاهده کردیم.
این مدل برای یک دوره واحد در سری های مینی 128 روز پس از 256 سال برای مجموع 1 میلیون نسخه به روز رسانی آموزش دیده بود. ایالت ها در ابتدای هر انحلال مقدار صفر را صفر کردند و در به روز رسانی ها برای شبیه سازی تکثیر کامل و پیشبرد انتشار اطلاعات در خارج از یک پسوند داده شده ادامه دادند.[12] برای تسریع یادگیری با سرعت اولیه یادگیری 5e-4 که ​​در طول دوره آموزشی به صورت خطی به صفر رسید، استفاده شد. نرمال سازی وزن [13] به پارامترهای LSTM اعمال شد. داده های موازی در 4 Pascal Titan X gpus مورد استفاده قرار گرفت تا سرعت آموزش و افزایش حافظه موثر را افزایش دهد. آموزش حدود یک ماه طول کشید. این مدل جمع و جور است که حاوی تقریبا پارامترهای بسیاری است، زیرا در مجموعه داده های آموزشی مورد بررسی قرار گرفته است. همچنین با توجه به عملکرد در یک سطح بات، نسبت بالا نسبت به محاسبات به پارامترهای کل در مقایسه با سایر مدل های زبان های بزرگ در مقیاس بزرگ است. مدل انتخابی به 1.12 بیت در هر بایت می رسد.
![شکل 2. عملکرد در نسخه باینری SST به عنوان یک تابع از نمونه های آموزش نشانه گذاری شده است. خطوط جامد نشان می دهد که میانگین 100 اجرا می شود در حالیکه مناطق محصور شده درصد 10 و 90 را نشان می دهند. نتایج قبلی در مجموعه داده ها به صورت خطوط خطا با اعداد نشان داده شده اند که نشان دهنده مقدار نمونه هایی است که برای رگرسیون لجستیک بر روی بازنمایی mLSTM بایت برای عملکرد آنها مطابقت دارد.](https://boute.s3.amazonaws.com/297-2.jpg)
**4.1. راه اندازی تجربی و نتایج**
مدل این مقاله متن را به عنوان دنباله ای از بایت های کدگذاری UTF-8 پردازش می کند[14]. برای هر بایت، مدل حالت پنهان خود را به روز می کند و یک توزیع احتمالی را در بایت ممکن بعدی پیش بینی می کند. وضعیت پنهان این مدل به عنوان یک خلاصه آنلاین از دنباله ای است که تمام اطلاعاتی را که مدل برای حفظ آن مربوط به پیش بینی بایت های آینده دنبال می کند، کپی می کند.این مقاله علاقه مند به درک ویژگی های کد گذاری آموخته شده است. فرآیند استخراج نمایه ویژگی به شرح زیر است:
• از آنجا که خطوط جدید به عنوان محدوده بازبینی در مجموعه داده آموزشی مورد استفاده قرار می گیرند، تمام کاراکترهای خط جدید با فاصله مخلوط می شوند تا از حالت بازنشانی مدل اجتناب شود.
• هر فضای خالی پیشرو حذف شده و با یک خط جدید و فاصله جایگزین شده است تا یک نشانه شروع را شبیه سازی کند. هر فضای خالی رو به عقب حذف شده و با یک فضای جایگزین می شود تا یک نشانه پایان را شبیه سازی کند. متن به عنوان توالی بایت UTF8 رمزگذاری می شود.
• مقدار اولیه حالت های مدل صفر تعیین می شوند. این مدل توالی را پردازش می کند و وضعیت سلول نهایی mLSTM به عنوان نمایه ی ویژگی مورد استفاده قرار می گیرد. Tanh به مقادیر بین 1- و 1 اعمال می شود.
مقاله از روش شناخته شده در [2] پیروی می کند. یک استثناء این است که به جای L2 از یک جریمه L1 برای نتایج طبقه بندی متن استفاده کرده است.
**4.1.1 . مرور تجزیه و تحلیل احساسات**
جدول 1 نتایج مدل را در چهار مجموعه داده های طبقه بندی متن استاندارد نشان می دهد. عملکرد مدل قابل توجه است. در مورد[15]  MR  و [16] CR مجموعه داده های تجزیه و تحلیل احساسات وضعیت هنر با حاشیه قابل توجهی را بهبود بخشیده است. مجموعه داده های MR و CR جمله هایی هستند که از Tomatoes Rotten، یک وب سایت بررسی فیلم و بررسی محصولات آمازون (که تقریبا به طور همپوشانی با بخش آموزش ما) استخراج شده است. این نشان می دهد که مدل مقاله یک نمایش غنی از متن را از یک دامنه مشابه آموخته است. در دو مجموعه داده های دیگر، تشخیص براساس شی و فرد (SUBJ) و پلت فرم نظر [17] MPQA ، مدل مقاله هیچ مزیتی قابل توجهی نسبت به سایر روش های یادگیری بازنمایی بدون نظارت ندارد و هنوز با رویکرد با نظارت کار می‌کند.
در این مقاله همچنین مجموعه ای گسترده از مجموعه داده های تجزیه و تحلیل احساسات با خواص مختلف را آزمایش شده است. Treebankاحساسات استنفورد [18] (SST)  به طور خاص برای ارزیابی مدل های ترکیبی پیچیده تر زبان ایجاد شد. این از همان مجموعه داده های پایه به عنوان MR استخراج شده است، اما از طریق Amazon Mechanical مشتق شده و حاوی برچسب های متراکم از عبارات درختان تجزیه شده محاسبه شده برای همه جملات است. برای فعالیت های فرعی باینری ، این مقدار به 76961 کل برچسب در مقایسه با برچسب 6920 جمله اشاره می کند. 
بازنمایی که توسط این مدل به دست آمده، به ترتیب 91.8٪، به میزان قابل ملاحظه ای از وضعیت هنر 90.2٪ با یک گروه 30 مدل [19] پیشرفت کرده است. همانطور که در شکل 2 نشان داده شده است، مدل دارای اطلاعات بسیار کارآمد است. این عملکرد پایه را با استفاده از چند نمونه ضرب شده نشان می دهد و همه نتایج قبلی را تنها با چند صد نمونه نشان می دهد. این زیر 10٪ مجموع جملات در مجموعه داده است.
![جدول 1. دقت طبقه بندی داده های کوچک](https://boute.s3.amazonaws.com/297-T1.jpg)
**4.2.1. واحد احساسات**
مزیت یک جریمه L1 در رژیم داده های کم (شکل 2 را ببینید) یک سرنخ است. تنظیم L1 برای کاهش پیچیدگی نمونه وقتی که بسیاری از ویژگی های نامطمئن وجود دارد است[20]. این احتمالا برای این مدل نیز وجود دارد، زیرا به عنوان یکی از ویژگی های با نظارت نیست بلکه به عنوان یک زبان زبان آموزش دیده است. با بررسی سهم نسبی ویژگی ها در مجموعه داده های مختلف، یک واحد را در mLSTM کشف کرده که مستقیما با احساسات مرتبط است. شکل 3 هیستوگرام فعال سازی نهایی این واحد پس از پردازش IMDB را نشان می دهد [21] که یک توزیع دوبعدی را با جدایی جدی بین بررسی های مثبت و منفی نشان می دهد. در شکل 4، فعال سازی این واحد را در 6 بررسی تصادفی انتخاب شده از مجموعه ای از 100 بررسی کنتراست بالا نشان داده است که آن را به عنوان برآورد آنلاین از احساسات محلی بررسی می کند. قرار دادن آستانه در این واحد ، دقت آزمایش را 92.30٪ می کند. با استفاده از بازنمایی 4096 واحد کامل، 92.88٪ به دست می آید. این بهبود فقط 0.58٪ بیش از واحد احساس است که نشان می دهد تقریبا تمام اطلاعات مدل حفظ می شود که مربوط به تجزیه و تحلیل احساسات در فرم بسیار جمع و جور از یک اسکالر تنها نشان داده شده است. جدول 2 لیستی کامل از نتایج را در مجموعه داده های IMDB دارد.
![شکل 3.هیستوگرام ارزش فعال سازی سلول برای واحد احساسات در بررسی IMDB.](https://boute.s3.amazonaws.com/297-3.jpg)

![شکل 4.تصور فعال سازی در 6 بررسی تصادفی انتخاب شده از مجموعه  کنتراست IMDB قرمز نشان دهنده احساسات منفی است در حالی که سبز احساسات مثبت را نشان می دهد. بهترین در رنگ ها دیده می شود.](https://boute.s3.amazonaws.com/297-4.jpg)

![جدول 2. طبقه بندی احساسات IMDB](https://boute.s3.amazonaws.com/297-T2.jpg)

**4.3.1.سقف ظرفیت**
در این قسمت بررسی شده که چگونه بازنمایی مدل به مجموعه داده های بزرگ تر می رسد. مقاله رویکردی را در مورد نسخه باینری چالش Dataset در سال 2015 که در  [22] معرفی شده است، بررسی می کند. این مجموعه داده حاوی 598000 نمونه است که بزرگتر از هر مجموعه داده دیگری است که مورد
آزمایش قرار گرفته است. هنگامی که عملکرد را به عنوان تابعی از تعداد نمونه های آموزش دیده مثلا در شکل 5 تصور کنیم ، مشاهده می شود "سقف ظرفیت" که در آن دقت آزمون این رویکرد فقط با کمی بیش از 1٪ در چهار مرتبه افزایش در داده های آموزش دیده بهبود می یابد. با استفاده از مجموعه داده های کامل، به دقت 95.22٪ رسیده اند. این بهتر از بازده BW TFIDF baseline در 93.66٪ است، اما کمی بدتر از 95.64٪ از یک طبقه بندی خطی در بالای 500.000 اغلب n-grams به طول 5 است.
سقف ظرفیت مشاهده شده، یک پدیده جالب و نقطه عطفی برای بازنمایی بدون نظارت مقاله است. عوامل مختلفی باعث ایجاد این امر می شوند. از آنجا که مدل مقاله فقط در بررسی آمازون آموزش دیده است، به نظر نمی رسد که به مفاهیم خاص دیگر دامنه حساس باشد. به عنوان مثال، بررسی Yelp از کسب و کار است، جایی که جزئیات مانند مهمان نوازی، مکان، و فضا مهم هستند. اما این ایده ها در بررسی محصولات وجود ندارد. علاوه بر این، کاهش نسبی در عملکرد رویکرد مقاله، انتقال از جمله به مجموعه داده های سند وجود دارد. این به احتمال زیاد  دلیل کار کردن در سطح بایت است و منجر به تمرکز بر محتویات چند جمله اخیر به جای کل سند می شود. در نهایت، با افزایش میزان داده های نشانه گذاری شده، عملکرد مدل خطی ساده که در بازنمایی ایستا آموزش داده میشود، اشباع خواهد شد. مدل های پیچیده ای که به طور صریح برای یک کار آموزش دیده اند می توانند به بهبود و در نهایت رویکرد این مقاله با داده های کافی برچسب گذاری شده را بهبود بخشند.
![شکل 5.عملکرد در نسخه باینری Yelp بررسی مجموعه داده ها به عنوان یک تابع از نمونه های آموزش برچسب شده است. پلاتهای عملکردی مدل بعد از حدود ده نمونه نشان داده شده و تنها با آگاهی از اطلاعات اضافی بهبود می یابند.](https://boute.s3.amazonaws.com/297-5.jpg)
**4.4.1 .تجزیه و تحلیل تولید**
اگرچه تمرکز تجزیه و تحلیل مقاله بر ویژگی های بازنمایی مدل است، اما به عنوان یک مدل نسبی آموزش دیده است. [23] و [24] هر دو مدل های نسبی مشروطی را طراحی کرده اند تا محتوای متن را از ویژگی های مختلف مانند احساسات و یا تنش جدا کنند. هدف این مقاله این بوده است که یک نتیجه مشابه را می توان با استفاده از واحد احساسات به دست آورد. در جدول 3 نشان داده شده که به سادگی تنظیم واحد احساسات مثبت یا منفی، مدل تولید بازخورد مثبت یا منفی متناظر است. در حالی که همه بررسی های منفی نمونه دارای جملات با احساسات منفی هستند، گاهی اوقات نیز جمله هایی با احساسات مثبت نیز وجود دارد. با این وجود، جالب است بدانیم که چنین دستکاری ساده ای از بازنمایی مدل اثر قابل توجهی بر رفتار آن دارد. نمونه نیز برای یک مدل زبان بایت با کیفیت بالا و اغلب شامل جملات معتبر می باشد.
![جدول 3. نمونه های تصادفی از مدل تولید شده هنگامی که ارزش حالت پنهان احساسات برای 1- یا 1 برای تمام مراحل ثابت می شود. واحد احساسات تاثیر زیادی بر روند تولید نسبی آن دارد.](https://boute.s3.amazonaws.com/297-2.png)
**5.1 .نتیجه گیری**
این یک سوال باز است که چرا این مدل مفهوم احساسات را به گونه ای دقیق، منسجم، قابل تفسیر و قابل دستکاری باز می کند. این ممکن است که احساس به عنوان یک ویژگی قابل پیش بینی قوی برای مدل سازی زبان باشد. این احتمال وجود دارد که احساسات یک جزء مهم بررسی باشند. 
مقاله حساسیت بازنمایی های آماری را به توزیع داده هایی که آموزش می دهند، را برجسته می کند. نتایج نشان می دهد که انتظار یک مدل آموزش یافته در یک مجموعه از کتاب ها، جایی که دو ژانر رایج و عاشقانه و فانتزی باشد، برای یادگیری رمزگذاری که احساسات باید دقیق بررسی شوند غیر واقعی است. به همین ترتیب، انتظار بازنمایی از محتوای معنایی دقیق یک عنوان از یک تصویر یا یک ویدیو از مدل هایی که در بررسی محصولات آمازون آموزش دیده اند، غیر واقعی است.
**2. پیاده سازی **
کد این مقاله از سایت GitHub برداشته شده است و لینک آن در این گزارش قرار دادهش شده است. داده های آن 1822 جمله است که برای test و train از آن ها استفاده شده  و به صورت زیر فراخوانی شده است:

	def sst_binary(data_dir='data/'):
    """
    Most standard models make use of a preprocessed/tokenized/lowercased version
    of Stanford Sentiment Treebank. Our model extracts features from a version
    of the dataset using the raw text instead which we've included in the data
    folder.
    """
    trX, trY = load_sst(os.path.join(data_dir, 'train_binary_sent.csv'))
    vaX, vaY = load_sst(os.path.join(data_dir, 'dev_binary_sent.csv'))
    teX, teY = load_sst(os.path.join(data_dir, 'test_binary_sent.csv'))
    return trX, vaX, teX, trY, vaY, teY
به روزرسانی حالت پنهان که در مقاله به این شکل عنوان شده:
از آنجا که خطوط جدید به عنوان محدوده بازبینی در مجموعه داده آموزشی مورد استفاده قرار می گیرند، تمام کاراکترهای خط جدید با فاصله جایگزین می شوند تا از حالت بازنشانی مدل اجتناب شود.   هر فضای خالی پیشرو حذف شده و با یک خط جدید و فاصله جایگزین شده است تا یک نشانه شروع را شبیه سازی کند. هر فضای خالی رو به عقب حذف شده و با یک فضای خالی جایگزین می شود تا یک نشانه پایان را شبیه سازی کند. متن به عنوان توالی بایت UTF8 رمزگذاری می شود.   مقدار اولیه حالت های مدل صفر تعیین می شوند.
به صورت زیر پیدا سازی شده که به عنوان preprocess است و قبل از train انجام می­شود:

	def preprocess(text, front_pad='\n ', end_pad=' '):
    text = html.unescape(text)
    text = text.replace('\n', ' ').strip()
    text = front_pad+text+end_pad
    text = text.encode()
    return text

 مقادیر شبکه مورد نظر  تعیین شده  و گراف ساخته می شود:
 
	def model(X, S, M=None, reuse=False):
    nsteps = X.get_shape()[1]
    cstart, hstart = tf.unstack(S, num=hps.nstates)
    with tf.variable_scope('model', reuse=reuse):
        words = embd(X, hps.nembd)
        inputs = tf.unstack(words, nsteps, 1)
        hs, cells, cfinal, hfinal = mlstm(
            inputs, cstart, hstart, M, hps.nhidden, scope='rnn', wn=hps.rnn_wn)
        hs = tf.reshape(tf.concat(hs, 1), [-1, hps.nhidden])
        logits = fc(
            hs, hps.nvocab, act=lambda x: x, wn=hps.out_wn, scope='out')
    states = tf.stack([cfinal, hfinal], 0)
    return cells, states, logits

در این  مقاله از روش mlstm استفاده شده و برای multiplicative شدن lstm از 4 ، W استفاده شده است.

	def fc(x, nout, act, wn=False, bias=True, scope='fc'):
    with tf.variable_scope(scope):
        nin = x.get_shape()[-1].value
        w = tf.get_variable("w", [nin, nout], initializer=load_params)
        if wn:
            g = tf.get_variable("g", [nout], initializer=load_params)
        if wn:
            w = tf.nn.l2_normalize(w, dim=0) * g
        z = tf.matmul(x, w)
        if bias:
            b = tf.get_variable("b", [nout], initializer=load_params)
            z = z+b
        h = act(z)
        return h

این پیاده سازی برای mlstm متغیرهای وزن  را به صورت زیر تعریف کرده است:

	def mlstm(inputs, c, h, M, ndim, scope='lstm', wn=False):
    nin = inputs[0].get_shape()[1].value
    with tf.variable_scope(scope):
        wx = tf.get_variable("wx", [nin, ndim * 4], initializer=load_params)
        wh = tf.get_variable("wh", [ndim, ndim * 4], initializer=load_params)
        wmx = tf.get_variable("wmx", [nin, ndim], initializer=load_params)
        wmh = tf.get_variable("wmh", [ndim, ndim], initializer=load_params)
        b = tf.get_variable("b", [ndim * 4], initializer=load_params)
        if wn:
            gx = tf.get_variable("gx", [ndim * 4], initializer=load_params)
            gh = tf.get_variable("gh", [ndim * 4], initializer=load_params)
            gmx = tf.get_variable("gmx", [ndim], initializer=load_params)
            gmh = tf.get_variable("gmh", [ndim], initializer=load_params)
    if wn:
        wx = tf.nn.l2_normalize(wx, dim=0) * gx
        wh = tf.nn.l2_normalize(wh, dim=0) * gh
        wmx = tf.nn.l2_normalize(wmx, dim=0) * gmx
        wmh = tf.nn.l2_normalize(wmh, dim=0) * gmh


سپس تابعی که در بلاک lstm قرار می گیرد را به صورت خاص تعریف کرده اند به صورت زیر:

	cs = []
    for idx, x in enumerate(inputs):
        m = tf.matmul(x, wmx)*tf.matmul(h, wmh)
        z = tf.matmul(x, wx) + tf.matmul(m, wh) + b
        i, f, o, u = tf.split(z, 4, 1)
        i = tf.nn.sigmoid(i)
        f = tf.nn.sigmoid(f)
        o = tf.nn.sigmoid(o)
        u = tf.tanh(u)
        if M is not None:
            ct = f*c + i*u
            ht = o*tf.tanh(ct)
            m = M[:, idx, :]
            c = ct*m + c*(1-m)
            h = ht*m + h*(1-m)
        else:
            c = f*c + i*u
            h = o*tf.tanh(c)
        inputs[idx] = h
        cs.append(c)
    cs = tf.stack(cs)
    return inputs, cs, c, h

در این کد Train با استفاده از تابعی به نام transform انجام می شود که به صورت زیر تعریف شده است:

	def transform(xs):
            tstart = time.time()
            xs = [preprocess(x) for x in xs]
            lens = np.asarray([len(x) for x in xs])
            sorted_idxs = np.argsort(lens)
            unsort_idxs = np.argsort(sorted_idxs)
            sorted_xs = [xs[i] for i in sorted_idxs]
            maxlen = np.max(lens)
            offset = 0
            n = len(xs)
            smb = np.zeros((2, n, hps.nhidden), dtype=np.float32)
            for step in range(0, ceil_round_step(maxlen, nsteps), nsteps):
                start = step
                end = step+nsteps
                xsubseq = [x[start:end] for x in sorted_xs]
                ndone = sum([x == b'' for x in xsubseq])
                offset += ndone
                xsubseq = xsubseq[ndone:]
                sorted_xs = sorted_xs[ndone:]
                nsubseq = len(xsubseq)
                xmb, mmb = batch_pad(xsubseq, nsubseq, nsteps)
                for batch in range(0, nsubseq, nbatch):
                    start = batch
                    end = batch+nbatch
                    batch_smb = seq_rep(
                        xmb[start:end], mmb[start:end],
                        smb[:, offset+start:offset+end, :])
                    smb[:, offset+start:offset+end, :] = batch_smb
            features = smb[0, unsort_idxs, :]
            print('%0.3f seconds to transform %d examples' %
                  (time.time() - tstart, n))
            return features

که در آن حلقه آموزش به صورت زیر است:

	for batch in range(0, nsubseq, nbatch):
                    start = batch
                    end = batch+nbatch
                    batch_smb = seq_rep(
                        xmb[start:end], mmb[start:end],
                        smb[:, offset+start:offset+end, :])
                    smb[:, offset+start:offset+end, :] = batch_smb
            features = smb[0, unsort_idxs, :]

تنسورفلو برای اجرای مدل از session به صورت زیر استفاده می کند. و مقداردهنده ها   را فعال کرده و مقادیر اولیه پارامترها تخصیص داده می شوند. 

	sess = tf.Session()
        tf.global_variables_initializer().run(session=sess)
        def seq_rep(xmb, mmb, smb):
            return sess.run(states, {X: xmb, M: mmb, S: smb})
        def seq_cells(xmb, mmb, smb):
            return sess.run(cells, {X: xmb, M: mmb, S: smb})

با توجه به کد زیر میبینیم که داده‌ها فراخوانی شده و سپس تابع transform که برای train بود فراخوانی شده و در نهایت نتایج همان‌طور که در کد قابل مشاهده است برگردانده می شوند.

	trX, vaX, teX, trY, vaY, teY = sst_binary()
	trXt = model.transform(trX)
	vaXt = model.transform(vaX)
	teXt = model.transform(teX)
	# classification results
	full_rep_acc, c, nnotzero =train_with_reg_cv(trXt, trY, vaXt, vaY, teXt, teY)
	print('%05.2f test accuracy'%full_rep_acc)
	print('%05.2f regularization coef'%c)
	print('%05d features used'%nnotzero)
	# visualize sentiment unit
	sentiment_unit = trXt[:, 2388]
	plt.hist(sentiment_unit[trY==0], bins=25,alpha=0.5, label='neg')
	plt.hist(sentiment_unit[trY==1], bins=25,alpha=0.5, label='pos')
	plt.legend()
	plt.show()	

**3. مراجع**

[1] Olshausen, Bruno A and Field, David J. Sparse coding with an overcomplete basis set: A strategy employed by v1 Vision research, 37(23):3311–3325, 1997.
[2] Kiros, Ryan, Zhu, Yukun, Salakhutdinov, Ruslan R, Zemel, Richard, Urtasun, Raquel, Torralba, Antonio, and Fidler, Sanja. Skip-thought vectors. In Advances in neural information processing systems, pp. 3294–3302, 2015.
[3] Ba, Jimmy Lei, Kiros, Jamie Ryan, and Hinton, Geoffrey E. Layer normalization. arXiv preprint arXiv:1607.06450, 2016.
[4] Dai, AndrewMand Le, Quoc V.Semi-supervised sequence learning. In Advances in Neural Information Processing Systems, pp. 3079–3087, 2015.
[5] Dieng, Adji B, Wang, Chong, Gao, Jianfeng, and Paisley, John. Topicrnn: A recurrent neural network with long-range semantic dependency. arXiv preprint arXiv:1611.01702, 2016.
[6] Mikolov, Tomas, Yih, Wen-tau, and Zweig, Geoffrey. Linguistic regularities in continuous space word representations, 2013.
[7] Marcus, Mitchell P, Marcinkiewicz, Mary Ann, and Santorini, Beatrice. Building a large annotated corpus
of english: The penn treebank. Computational linguistics, 19(2):313–330, 1993.
[8] Hutter, Marcus. The human knowledge compression contest. 2006. URL http://prize. hutter1. net, 2006.
[9] Jozefowicz, Rafal, Vinyals, Oriol, Schuster, Mike, Shazeer, Noam, and Wu, Yonghui. Exploring the limits of language
modeling. arXiv preprint arXiv:1602.02410, 2016.
[10] McAuley, Julian, Pandey, Rahul, and Leskovec, Jure. Inferring networks of substitutable and complementary products.
In Proceedings of the 21th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining, pp. 785–794. ACM, 2015.
[11] Krause, Ben, Lu, Liang, Murray, Iain, and Renals, Steve. Multiplicative lstm for sequence modelling. arXiv preprint arXiv:1609.07959, 2016.
[12] Kingma, Diederik and Ba, Jimmy. Adam: A method for stochastic optimization. arXiv preprint arXiv:1412.6980, 2014.
[13] Salimans, Tim and Kingma, Diederik P. Weight normalization: A simple reparameterization to accelerate training of deep neural networks. In Advances in Neural Information Processing Systems, pp. 901–901, 2016.
[14] Yergeau, Francois. Utf-8, a transformation format of iso 10646. 2003.
[15] Pang, Bo and Lee, Lillian. Seeing stars: Exploiting class relationships for sentiment categorization with respect to rating scales. In Proceedings of the 43rd annual meeting on association for computational linguistics, pp. 115–124. Association for Computational Linguistics, 2005. 
[16] Hu, Minqing and Liu, Bing. Mining and summarizing customer reviews. In Proceedings of the tenth ACM SIGKDD international conference on Knowledge discovery and data mining, pp. 168–177. ACM, 2004.
[17] Wiebe, Janyce, Wilson, Theresa, and Cardie, Claire. Annotating expressions of opinions and emotions in language. Language resources and evaluation, 39(2):165–210, 2005.
[18] Socher, Richard, Perelygin, Alex, Wu, Jean Y, Chuang, Jason, Manning, Christopher D, Ng, Andrew Y, Potts, Christopher, et al. Recursive deep models for semantic compositionality over a sentiment treebank. Citeseer, 2013.
[19] Looks, Moshe, Herreshoff, Marcello, Hutchins, DeLesley, and Norvig, Peter. Deep learning with dynamic computation graphs. arXiv preprint arXiv:1702.02181, 2017.
[20] Ng, Andrew Y. Feature selection, l 1 vs. l 2 regularization, and rotational invariance. In Proceedings of the twentyfirst international conference on Machine learning, pp.78. ACM, 2004.
[21] Maas, Andrew L, Daly, Raymond E, Pham, Peter T, Huang, Dan, Ng, Andrew Y, and Potts, Christopher. Learning word vectors for sentiment analysis. In Proceedings of the 49th Annual Meeting of the Association for Computational Linguistics: Human Language Technologies- Volume 1, pp. 142–150. Association for Computational Linguistics, 2011.
[22] Zhang, Xiang, Zhao, Junbo, and LeCun, Yann. Characterlevel convolutional networks for text classification. In Advances in neural information processing systems, pp.649–657, 2015.
[23] Hu, Zhiting, Yang, Zichao, Liang, Xiaodan, Salakhutdinov, Ruslan, and Xing, Eric P. Controllable text generation.
arXiv preprint arXiv:1703.00955, 2017.
[24] Dong, Li, Huang, Shaohan, Wei, Furu, Lapata, Mirella, Zhou, Ming, and Ke, Xu. Learning to generate product reviews
from attributes. In Proceedings of the 15 Conference of the European Chapter of the Association for Computational Linguistics, pp. 623–632.Association for Computational Linguistics, 2017.