<div class="xblock xblock-public_view xblock-public_view-vertical" data-block-type="vertical" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="VerticalStudentView" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@vertical+block@recommender_systems_notes" data-graded="False" data-runtime-class="LmsRuntime">
<h2 class="hd hd-2 unit-title">Notes – Chapter 13: Recommender systems</h2>
<div class="vert-mod">
<div class="vert vert-0" data-id="block-v1:MITx+6.036+1T2019+type@html+block@recommender_systems_notes_top">
<div class="xblock xblock-public_view xblock-public_view-html xmodule_display xmodule_HtmlBlock" data-block-type="html" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="XBlockToXModuleShim" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@html+block@recommender_systems_notes_top" data-graded="False" data-runtime-class="LmsRuntime">
<script type="json/xblock-args" class="xblock-json-init-args">
{"xmodule-type": "HTMLModule"}
</script>
<p>
You can sequence through the Recommender systems lecture video and note segments (go to Next page). </p><p>
You can also (or alternatively) download the <a href="/assets/courseware/v1/d47d5e8f3dc7157f83382f72e103f8e4/asset-v1:MITx+6.036+1T2019+type@asset+block/notes_chapter_Recommender_systems.pdf" target="_blank">Chapter 13: Recommender systems</a> notes as a PDF file. </p><p>
You may find the (optional) <a href="/assets/courseware/v1/8b609c84fc452d77fd213069ca3504e7/asset-v1:MITx+6.036+1T2019+type@asset+block/notes_chapter_Appendices.pdf" target="_blank">appendix</a> on collaborative filtering and the singular value decomposition (SVD) to be of interest. </p>
</div>
</div>
</div>
</div>
<div class="xblock xblock-public_view xblock-public_view-vertical" data-block-type="vertical" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="VerticalStudentView" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@vertical+block@MIT6036L11a_vert" data-graded="False" data-runtime-class="LmsRuntime">
<h2 class="hd hd-2 unit-title">Lecture: Recommender systems - introduction</h2>
<div class="vert-mod">
<div class="vert vert-0" data-id="block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11a">
<div class="xblock xblock-public_view xblock-public_view-video xmodule_display xmodule_VideoBlock" data-block-type="video" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="XBlockToXModuleShim" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11a" data-graded="False" data-runtime-class="LmsRuntime">
<script type="json/xblock-args" class="xblock-json-init-args">
{"xmodule-type": "Video"}
</script>
<h3 class="hd hd-2">Lecture: Recommender systems - introduction</h3>
<div
id="video_MIT6036L11a"
class="video closed"
data-metadata='{"saveStateEnabled": false, "autoplay": false, "publishCompletionUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11a/handler/publish_completion", "start": 0.0, "prioritizeHls": false, "saveStateUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11a/handler/xmodule_handler/save_user_state", "recordedYoutubeIsAvailable": true, "streams": "1.00:EOZd_kY9sLs", "autoAdvance": false, "transcriptAvailableTranslationsUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11a/handler/transcript/available_translations", "captionDataDir": null, "ytMetadataEndpoint": "", "showCaptions": "true", "lmsRootURL": "https://openlearninglibrary.mit.edu", "transcriptTranslationUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11a/handler/transcript/translation/__lang__", "ytApiUrl": "https://www.youtube.com/iframe_api", "transcriptLanguages": {"en": "English"}, "speed": null, "autohideHtml5": false, "generalSpeed": 1.0, "transcriptLanguage": "en", "savedVideoPosition": 0.0, "poster": null, "sources": [], "duration": 0.0, "end": 0.0, "completionEnabled": false, "completionPercentage": 0.95, "ytTestTimeout": 1500}'
data-bumper-metadata='null'
data-autoadvance-enabled="False"
data-poster='null'
tabindex="-1"
>
<div class="focus_grabber first"></div>
<div class="tc-wrapper">
<div class="video-wrapper">
<span tabindex="0" class="spinner" aria-hidden="false" aria-label="Loading video player"></span>
<span tabindex="-1" class="btn-play fa fa-youtube-play fa-2x is-hidden" aria-hidden="true" aria-label="Play video"></span>
<div class="video-player-pre"></div>
<div class="video-player">
<div id="MIT6036L11a"></div>
<h4 class="hd hd-4 video-error is-hidden">No playable video sources found.</h4>
<h4 class="hd hd-4 video-hls-error is-hidden">
Your browser does not support this video format. Try using a different browser.
</h4>
</div>
<div class="video-player-post"></div>
<div class="closed-captions"></div>
<div class="video-controls is-hidden">
<div>
<div class="vcr"><div class="vidtime">0:00 / 0:00</div></div>
<div class="secondary-controls"></div>
</div>
</div>
</div>
</div>
<div class="focus_grabber last"></div>
</div>
</div>
</div>
</div>
</div>
<div class="xblock xblock-public_view xblock-public_view-vertical" data-block-type="vertical" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="VerticalStudentView" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@vertical+block@recommender_systems_top_vert" data-graded="False" data-runtime-class="LmsRuntime">
<h2 class="hd hd-2 unit-title">Introduction to recommender systems</h2>
<div class="vert-mod">
<div class="vert vert-0" data-id="block-v1:MITx+6.036+1T2019+type@html+block@recommender_systems_top">
<div class="xblock xblock-public_view xblock-public_view-html xmodule_display xmodule_HtmlBlock" data-block-type="html" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="XBlockToXModuleShim" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@html+block@recommender_systems_top" data-graded="False" data-runtime-class="LmsRuntime">
<script type="json/xblock-args" class="xblock-json-init-args">
{"xmodule-type": "HTMLModule"}
</script>
<p>
The problem of choosing items from a large set to recommend to a user comes up in many contexts, including music services, shopping, and online advertisements. As well as being an important application, it is interesting because it has several formulations, some of which take advantage of a particular interesting structure in the problem. </p><p>
Concretely, we can think about a company like Netflix, which recommends movies to its users. Netflix knows the ratings given by many different people to many different movies, and knows your ratings on a small subset of all possible movies. How should it use this data to recommend a movie for you to watch tonight? </p><p>
There are two prevailing approaches to this problem. The first, <em>content-based recommendation</em>, is formulated as a supervised learning problem. The second, <em>collaborative filtering</em>, introduces a new learning problem formulation. </p><p>
<br/></p><p>
<br/></p><p><a href="/assets/courseware/v1/d47d5e8f3dc7157f83382f72e103f8e4/asset-v1:MITx+6.036+1T2019+type@asset+block/notes_chapter_Recommender_systems.pdf" target="_blank">Download this chapter as a PDF file</a></p><span><br/><span style="color:gray;font-size:10pt"><center>This page was last updated on Thursday December 12, 2019; 09:34:32 PM (revision 4b592d7d7)</center></span></span>
</div>
</div>
</div>
</div>
<div class="xblock xblock-public_view xblock-public_view-vertical" data-block-type="vertical" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="VerticalStudentView" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@vertical+block@recommender_systems_content-based_recommendations_vert" data-graded="False" data-runtime-class="LmsRuntime">
<h2 class="hd hd-2 unit-title">Content-based recommendations</h2>
<div class="vert-mod">
<div class="vert vert-0" data-id="block-v1:MITx+6.036+1T2019+type@html+block@recommender_systems_content-based_recommendations">
<div class="xblock xblock-public_view xblock-public_view-html xmodule_display xmodule_HtmlBlock" data-block-type="html" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="XBlockToXModuleShim" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@html+block@recommender_systems_content-based_recommendations" data-graded="False" data-runtime-class="LmsRuntime">
<script type="json/xblock-args" class="xblock-json-init-args">
{"xmodule-type": "HTMLModule"}
</script>
<p>
In content-based recommendation, we try to learn a predictor, [mathjaxinline]f[/mathjaxinline], that uses the movies that you have rated so far as training data, find a hypothesis that maps a movie into a prediction of what rating you would give it, and then return some movies with high predicted ratings. </p><p>
The first step is designing representations for the input and output. </p><p>
It's actually pretty difficult to design a good feature representation for movies. Reasonable approaches might construct features based on the movie's genre, length, main actors, director, location, or even ratings given by some standard critics or aggregation sources. This design process would yield </p><table id="a0000000002" class="equation" width="100%" cellspacing="0" cellpadding="7" style="table-layout:auto"><tr><td class="equation" style="width:80%; border:none">[mathjax]\phi : \text {movie} \rightarrow \text {vector}\; \; .[/mathjax]</td><td class="eqnnum" style="width:20%; border:none"> </td></tr></table><p>
Movie ratings are generally given in terms of some number of stars, so the output domain might be {1, 2, 3, 4, 5}. It's not appropriate for one-hot encoding on the output, and pretending that these are real values is also not entirely sensible. Nevertheless, we will treat the output as if it's in [mathjaxinline]\mathbb {R}[/mathjaxinline]. <span options="" class="marginote"><span class="marginote_desc" style="display:none">Thermometer coding might be reasonable, but it's hard to say without trying it. Some more advanced techniques try to predict rankings (would I prefer movie A over movie B) rather than raw ratings.</span><span>note</span></span> <br/> <br/><span style="color:#FF0000"><b class="bf">Study Question:</b></span> <span style="color:#0000FF">What is the disadvantage of using one-hot? What is the disadvantage of using [mathjaxinline]\mathbb {R}[/mathjaxinline]?</span> <br/></p><p>
Now that we have an encoding, we can make a training set based on <em>your</em> previous ratings of movies </p><table id="a0000000003" class="equation" width="100%" cellspacing="0" cellpadding="7" style="table-layout:auto"><tr><td class="equation" style="width:80%; border:none">[mathjax]\left\{ \left(\phi (m^{(1)}), \text {rating}(m^{(1)})\right), \left(\phi (m^{(2)}), \text {rating}(m^{(2)})\right), \ldots \right\}[/mathjax]</td><td class="eqnnum" style="width:20%; border:none"> </td></tr></table><p>
The next step is to pick a loss function. This is closely related to the choice of output encoding. Since we decided to treat the output as a real, we can formulate the problem as a regression from [mathjaxinline]\phi \rightarrow \mathbb {R}[/mathjaxinline], with [mathjaxinline]\text {Loss}(p, y) = \frac{1}{2}(y-p)^2[/mathjaxinline] We will generally need to regularize because we typically have a very small amount of data (unless you really watch a lot of movies!). </p><p>
Finally, we need to pick a hypothesis space. The simplest thing would be to make it linear, but you could definitely use something fancier, like a neural network. </p><p>
If we put all this together, with a linear hypothesis space, we end up with the objective </p><table id="a0000000004" class="equation" width="100%" cellspacing="0" cellpadding="7" style="table-layout:auto"><tr><td class="equation" style="width:80%; border:none">[mathjax]J(\theta ) = \frac{1}{2}\sum _{i \in D_ a} (y^{(i)} - \theta ^ T x^{(i)} - \theta _0)^2 + \frac{\lambda }{2} \left\lVert \theta \right\rVert ^2\; \; .[/mathjax]</td><td class="eqnnum" style="width:20%; border:none"> </td></tr></table><p>
This is our old friend, ridge regression, and can be solved analytically or with gradient descent. </p><p>
<br/></p><p>
<br/></p><p><a href="/assets/courseware/v1/d47d5e8f3dc7157f83382f72e103f8e4/asset-v1:MITx+6.036+1T2019+type@asset+block/notes_chapter_Recommender_systems.pdf" target="_blank">Download this chapter as a PDF file</a></p><script src="/assets/courseware/v1/1ab2c06aefab58693cfc9c10394b7503/asset-v1:MITx+6.036+1T2019+type@asset+block/marginotes.js" type="text/javascript"/><span><br/><span style="color:gray;font-size:10pt"><center>This page was last updated on Friday May 24, 2019; 02:29:50 PM (revision 4f166135)</center></span></span>
</div>
</div>
</div>
</div>
<div class="xblock xblock-public_view xblock-public_view-vertical" data-block-type="vertical" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="VerticalStudentView" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@vertical+block@MIT6036L11b_vert" data-graded="False" data-runtime-class="LmsRuntime">
<h2 class="hd hd-2 unit-title">Lecture: Collaborative filtering - framework</h2>
<div class="vert-mod">
<div class="vert vert-0" data-id="block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11b">
<div class="xblock xblock-public_view xblock-public_view-video xmodule_display xmodule_VideoBlock" data-block-type="video" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="XBlockToXModuleShim" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11b" data-graded="False" data-runtime-class="LmsRuntime">
<script type="json/xblock-args" class="xblock-json-init-args">
{"xmodule-type": "Video"}
</script>
<h3 class="hd hd-2">Lecture: Collaborative filtering - framework</h3>
<div
id="video_MIT6036L11b"
class="video closed"
data-metadata='{"saveStateEnabled": false, "autoplay": false, "publishCompletionUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11b/handler/publish_completion", "start": 0.0, "prioritizeHls": false, "saveStateUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11b/handler/xmodule_handler/save_user_state", "recordedYoutubeIsAvailable": true, "streams": "1.00:wKzdFan5FeU", "autoAdvance": false, "transcriptAvailableTranslationsUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11b/handler/transcript/available_translations", "captionDataDir": null, "ytMetadataEndpoint": "", "showCaptions": "true", "lmsRootURL": "https://openlearninglibrary.mit.edu", "transcriptTranslationUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11b/handler/transcript/translation/__lang__", "ytApiUrl": "https://www.youtube.com/iframe_api", "transcriptLanguages": {"en": "English"}, "speed": null, "autohideHtml5": false, "generalSpeed": 1.0, "transcriptLanguage": "en", "savedVideoPosition": 0.0, "poster": null, "sources": [], "duration": 0.0, "end": 0.0, "completionEnabled": false, "completionPercentage": 0.95, "ytTestTimeout": 1500}'
data-bumper-metadata='null'
data-autoadvance-enabled="False"
data-poster='null'
tabindex="-1"
>
<div class="focus_grabber first"></div>
<div class="tc-wrapper">
<div class="video-wrapper">
<span tabindex="0" class="spinner" aria-hidden="false" aria-label="Loading video player"></span>
<span tabindex="-1" class="btn-play fa fa-youtube-play fa-2x is-hidden" aria-hidden="true" aria-label="Play video"></span>
<div class="video-player-pre"></div>
<div class="video-player">
<div id="MIT6036L11b"></div>
<h4 class="hd hd-4 video-error is-hidden">No playable video sources found.</h4>
<h4 class="hd hd-4 video-hls-error is-hidden">
Your browser does not support this video format. Try using a different browser.
</h4>
</div>
<div class="video-player-post"></div>
<div class="closed-captions"></div>
<div class="video-controls is-hidden">
<div>
<div class="vcr"><div class="vidtime">0:00 / 0:00</div></div>
<div class="secondary-controls"></div>
</div>
</div>
</div>
</div>
<div class="focus_grabber last"></div>
</div>
</div>
</div>
</div>
</div>
<div class="xblock xblock-public_view xblock-public_view-vertical" data-block-type="vertical" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="VerticalStudentView" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@vertical+block@MIT6036L11c_vert" data-graded="False" data-runtime-class="LmsRuntime">
<h2 class="hd hd-2 unit-title">Lecture: Collaborative filtering - strategy</h2>
<div class="vert-mod">
<div class="vert vert-0" data-id="block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11c">
<div class="xblock xblock-public_view xblock-public_view-video xmodule_display xmodule_VideoBlock" data-block-type="video" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="XBlockToXModuleShim" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11c" data-graded="False" data-runtime-class="LmsRuntime">
<script type="json/xblock-args" class="xblock-json-init-args">
{"xmodule-type": "Video"}
</script>
<h3 class="hd hd-2">Lecture: Collaborative filtering - strategy</h3>
<div
id="video_MIT6036L11c"
class="video closed"
data-metadata='{"saveStateEnabled": false, "autoplay": false, "publishCompletionUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11c/handler/publish_completion", "start": 0.0, "prioritizeHls": false, "saveStateUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11c/handler/xmodule_handler/save_user_state", "recordedYoutubeIsAvailable": true, "streams": "1.00:U8fIX3aNvLU", "autoAdvance": false, "transcriptAvailableTranslationsUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11c/handler/transcript/available_translations", "captionDataDir": null, "ytMetadataEndpoint": "", "showCaptions": "true", "lmsRootURL": "https://openlearninglibrary.mit.edu", "transcriptTranslationUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11c/handler/transcript/translation/__lang__", "ytApiUrl": "https://www.youtube.com/iframe_api", "transcriptLanguages": {"en": "English"}, "speed": null, "autohideHtml5": false, "generalSpeed": 1.0, "transcriptLanguage": "en", "savedVideoPosition": 0.0, "poster": null, "sources": [], "duration": 0.0, "end": 0.0, "completionEnabled": false, "completionPercentage": 0.95, "ytTestTimeout": 1500}'
data-bumper-metadata='null'
data-autoadvance-enabled="False"
data-poster='null'
tabindex="-1"
>
<div class="focus_grabber first"></div>
<div class="tc-wrapper">
<div class="video-wrapper">
<span tabindex="0" class="spinner" aria-hidden="false" aria-label="Loading video player"></span>
<span tabindex="-1" class="btn-play fa fa-youtube-play fa-2x is-hidden" aria-hidden="true" aria-label="Play video"></span>
<div class="video-player-pre"></div>
<div class="video-player">
<div id="MIT6036L11c"></div>
<h4 class="hd hd-4 video-error is-hidden">No playable video sources found.</h4>
<h4 class="hd hd-4 video-hls-error is-hidden">
Your browser does not support this video format. Try using a different browser.
</h4>
</div>
<div class="video-player-post"></div>
<div class="closed-captions"></div>
<div class="video-controls is-hidden">
<div>
<div class="vcr"><div class="vidtime">0:00 / 0:00</div></div>
<div class="secondary-controls"></div>
</div>
</div>
</div>
</div>
<div class="focus_grabber last"></div>
</div>
</div>
</div>
</div>
</div>
<div class="xblock xblock-public_view xblock-public_view-vertical" data-block-type="vertical" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="VerticalStudentView" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@vertical+block@MIT6036L11d_vert" data-graded="False" data-runtime-class="LmsRuntime">
<h2 class="hd hd-2 unit-title">Lecture: Collaborative filtering - hypothesis space</h2>
<div class="vert-mod">
<div class="vert vert-0" data-id="block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11d">
<div class="xblock xblock-public_view xblock-public_view-video xmodule_display xmodule_VideoBlock" data-block-type="video" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="XBlockToXModuleShim" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11d" data-graded="False" data-runtime-class="LmsRuntime">
<script type="json/xblock-args" class="xblock-json-init-args">
{"xmodule-type": "Video"}
</script>
<h3 class="hd hd-2">Lecture: Collaborative filtering - hypothesis space</h3>
<div
id="video_MIT6036L11d"
class="video closed"
data-metadata='{"saveStateEnabled": false, "autoplay": false, "publishCompletionUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11d/handler/publish_completion", "start": 0.0, "prioritizeHls": false, "saveStateUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11d/handler/xmodule_handler/save_user_state", "recordedYoutubeIsAvailable": true, "streams": "1.00:nrl_RL6isxQ", "autoAdvance": false, "transcriptAvailableTranslationsUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11d/handler/transcript/available_translations", "captionDataDir": null, "ytMetadataEndpoint": "", "showCaptions": "true", "lmsRootURL": "https://openlearninglibrary.mit.edu", "transcriptTranslationUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11d/handler/transcript/translation/__lang__", "ytApiUrl": "https://www.youtube.com/iframe_api", "transcriptLanguages": {"en": "English"}, "speed": null, "autohideHtml5": false, "generalSpeed": 1.0, "transcriptLanguage": "en", "savedVideoPosition": 0.0, "poster": null, "sources": [], "duration": 0.0, "end": 0.0, "completionEnabled": false, "completionPercentage": 0.95, "ytTestTimeout": 1500}'
data-bumper-metadata='null'
data-autoadvance-enabled="False"
data-poster='null'
tabindex="-1"
>
<div class="focus_grabber first"></div>
<div class="tc-wrapper">
<div class="video-wrapper">
<span tabindex="0" class="spinner" aria-hidden="false" aria-label="Loading video player"></span>
<span tabindex="-1" class="btn-play fa fa-youtube-play fa-2x is-hidden" aria-hidden="true" aria-label="Play video"></span>
<div class="video-player-pre"></div>
<div class="video-player">
<div id="MIT6036L11d"></div>
<h4 class="hd hd-4 video-error is-hidden">No playable video sources found.</h4>
<h4 class="hd hd-4 video-hls-error is-hidden">
Your browser does not support this video format. Try using a different browser.
</h4>
</div>
<div class="video-player-post"></div>
<div class="closed-captions"></div>
<div class="video-controls is-hidden">
<div>
<div class="vcr"><div class="vidtime">0:00 / 0:00</div></div>
<div class="secondary-controls"></div>
</div>
</div>
</div>
</div>
<div class="focus_grabber last"></div>
</div>
</div>
</div>
</div>
</div>
<div class="xblock xblock-public_view xblock-public_view-vertical" data-block-type="vertical" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="VerticalStudentView" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@vertical+block@MIT6036L11e_vert" data-graded="False" data-runtime-class="LmsRuntime">
<h2 class="hd hd-2 unit-title">Lecture: Collaborative filtering - objective function</h2>
<div class="vert-mod">
<div class="vert vert-0" data-id="block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11e">
<div class="xblock xblock-public_view xblock-public_view-video xmodule_display xmodule_VideoBlock" data-block-type="video" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="XBlockToXModuleShim" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11e" data-graded="False" data-runtime-class="LmsRuntime">
<script type="json/xblock-args" class="xblock-json-init-args">
{"xmodule-type": "Video"}
</script>
<h3 class="hd hd-2">Lecture: Collaborative filtering - objective function</h3>
<div
id="video_MIT6036L11e"
class="video closed"
data-metadata='{"saveStateEnabled": false, "autoplay": false, "publishCompletionUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11e/handler/publish_completion", "start": 0.0, "prioritizeHls": false, "saveStateUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11e/handler/xmodule_handler/save_user_state", "recordedYoutubeIsAvailable": true, "streams": "1.00:E4NwAfdaLbs", "autoAdvance": false, "transcriptAvailableTranslationsUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11e/handler/transcript/available_translations", "captionDataDir": null, "ytMetadataEndpoint": "", "showCaptions": "true", "lmsRootURL": "https://openlearninglibrary.mit.edu", "transcriptTranslationUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11e/handler/transcript/translation/__lang__", "ytApiUrl": "https://www.youtube.com/iframe_api", "transcriptLanguages": {"en": "English"}, "speed": null, "autohideHtml5": false, "generalSpeed": 1.0, "transcriptLanguage": "en", "savedVideoPosition": 0.0, "poster": null, "sources": [], "duration": 0.0, "end": 0.0, "completionEnabled": false, "completionPercentage": 0.95, "ytTestTimeout": 1500}'
data-bumper-metadata='null'
data-autoadvance-enabled="False"
data-poster='null'
tabindex="-1"
>
<div class="focus_grabber first"></div>
<div class="tc-wrapper">
<div class="video-wrapper">
<span tabindex="0" class="spinner" aria-hidden="false" aria-label="Loading video player"></span>
<span tabindex="-1" class="btn-play fa fa-youtube-play fa-2x is-hidden" aria-hidden="true" aria-label="Play video"></span>
<div class="video-player-pre"></div>
<div class="video-player">
<div id="MIT6036L11e"></div>
<h4 class="hd hd-4 video-error is-hidden">No playable video sources found.</h4>
<h4 class="hd hd-4 video-hls-error is-hidden">
Your browser does not support this video format. Try using a different browser.
</h4>
</div>
<div class="video-player-post"></div>
<div class="closed-captions"></div>
<div class="video-controls is-hidden">
<div>
<div class="vcr"><div class="vidtime">0:00 / 0:00</div></div>
<div class="secondary-controls"></div>
</div>
</div>
</div>
</div>
<div class="focus_grabber last"></div>
</div>
</div>
</div>
</div>
</div>
<div class="xblock xblock-public_view xblock-public_view-vertical" data-block-type="vertical" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="VerticalStudentView" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@vertical+block@MIT6036L11f_vert" data-graded="False" data-runtime-class="LmsRuntime">
<h2 class="hd hd-2 unit-title">Lecture: Collaborative filtering - alternating least squares idea</h2>
<div class="vert-mod">
<div class="vert vert-0" data-id="block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11f">
<div class="xblock xblock-public_view xblock-public_view-video xmodule_display xmodule_VideoBlock" data-block-type="video" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="XBlockToXModuleShim" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11f" data-graded="False" data-runtime-class="LmsRuntime">
<script type="json/xblock-args" class="xblock-json-init-args">
{"xmodule-type": "Video"}
</script>
<h3 class="hd hd-2">Lecture: Collaborative filtering - alternating least squares idea</h3>
<div
id="video_MIT6036L11f"
class="video closed"
data-metadata='{"saveStateEnabled": false, "autoplay": false, "publishCompletionUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11f/handler/publish_completion", "start": 0.0, "prioritizeHls": false, "saveStateUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11f/handler/xmodule_handler/save_user_state", "recordedYoutubeIsAvailable": true, "streams": "1.00:nSDrIgBVgkQ", "autoAdvance": false, "transcriptAvailableTranslationsUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11f/handler/transcript/available_translations", "captionDataDir": null, "ytMetadataEndpoint": "", "showCaptions": "true", "lmsRootURL": "https://openlearninglibrary.mit.edu", "transcriptTranslationUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11f/handler/transcript/translation/__lang__", "ytApiUrl": "https://www.youtube.com/iframe_api", "transcriptLanguages": {"en": "English"}, "speed": null, "autohideHtml5": false, "generalSpeed": 1.0, "transcriptLanguage": "en", "savedVideoPosition": 0.0, "poster": null, "sources": [], "duration": 0.0, "end": 0.0, "completionEnabled": false, "completionPercentage": 0.95, "ytTestTimeout": 1500}'
data-bumper-metadata='null'
data-autoadvance-enabled="False"
data-poster='null'
tabindex="-1"
>
<div class="focus_grabber first"></div>
<div class="tc-wrapper">
<div class="video-wrapper">
<span tabindex="0" class="spinner" aria-hidden="false" aria-label="Loading video player"></span>
<span tabindex="-1" class="btn-play fa fa-youtube-play fa-2x is-hidden" aria-hidden="true" aria-label="Play video"></span>
<div class="video-player-pre"></div>
<div class="video-player">
<div id="MIT6036L11f"></div>
<h4 class="hd hd-4 video-error is-hidden">No playable video sources found.</h4>
<h4 class="hd hd-4 video-hls-error is-hidden">
Your browser does not support this video format. Try using a different browser.
</h4>
</div>
<div class="video-player-post"></div>
<div class="closed-captions"></div>
<div class="video-controls is-hidden">
<div>
<div class="vcr"><div class="vidtime">0:00 / 0:00</div></div>
<div class="secondary-controls"></div>
</div>
</div>
</div>
</div>
<div class="focus_grabber last"></div>
</div>
</div>
</div>
</div>
</div>
<div class="xblock xblock-public_view xblock-public_view-vertical" data-block-type="vertical" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="VerticalStudentView" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@vertical+block@MIT6036L11g_vert" data-graded="False" data-runtime-class="LmsRuntime">
<h2 class="hd hd-2 unit-title">Lecture: Collaborative filtering - alternating least squares algorithm</h2>
<div class="vert-mod">
<div class="vert vert-0" data-id="block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11g">
<div class="xblock xblock-public_view xblock-public_view-video xmodule_display xmodule_VideoBlock" data-block-type="video" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="XBlockToXModuleShim" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11g" data-graded="False" data-runtime-class="LmsRuntime">
<script type="json/xblock-args" class="xblock-json-init-args">
{"xmodule-type": "Video"}
</script>
<h3 class="hd hd-2">Lecture: Collaborative filtering - alternating least squares algorithm</h3>
<div
id="video_MIT6036L11g"
class="video closed"
data-metadata='{"saveStateEnabled": false, "autoplay": false, "publishCompletionUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11g/handler/publish_completion", "start": 0.0, "prioritizeHls": false, "saveStateUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11g/handler/xmodule_handler/save_user_state", "recordedYoutubeIsAvailable": true, "streams": "1.00:LwFSize-9s0", "autoAdvance": false, "transcriptAvailableTranslationsUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11g/handler/transcript/available_translations", "captionDataDir": null, "ytMetadataEndpoint": "", "showCaptions": "true", "lmsRootURL": "https://openlearninglibrary.mit.edu", "transcriptTranslationUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11g/handler/transcript/translation/__lang__", "ytApiUrl": "https://www.youtube.com/iframe_api", "transcriptLanguages": {"en": "English"}, "speed": null, "autohideHtml5": false, "generalSpeed": 1.0, "transcriptLanguage": "en", "savedVideoPosition": 0.0, "poster": null, "sources": [], "duration": 0.0, "end": 0.0, "completionEnabled": false, "completionPercentage": 0.95, "ytTestTimeout": 1500}'
data-bumper-metadata='null'
data-autoadvance-enabled="False"
data-poster='null'
tabindex="-1"
>
<div class="focus_grabber first"></div>
<div class="tc-wrapper">
<div class="video-wrapper">
<span tabindex="0" class="spinner" aria-hidden="false" aria-label="Loading video player"></span>
<span tabindex="-1" class="btn-play fa fa-youtube-play fa-2x is-hidden" aria-hidden="true" aria-label="Play video"></span>
<div class="video-player-pre"></div>
<div class="video-player">
<div id="MIT6036L11g"></div>
<h4 class="hd hd-4 video-error is-hidden">No playable video sources found.</h4>
<h4 class="hd hd-4 video-hls-error is-hidden">
Your browser does not support this video format. Try using a different browser.
</h4>
</div>
<div class="video-player-post"></div>
<div class="closed-captions"></div>
<div class="video-controls is-hidden">
<div>
<div class="vcr"><div class="vidtime">0:00 / 0:00</div></div>
<div class="secondary-controls"></div>
</div>
</div>
</div>
</div>
<div class="focus_grabber last"></div>
</div>
</div>
</div>
</div>
</div>
<div class="xblock xblock-public_view xblock-public_view-vertical" data-block-type="vertical" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="VerticalStudentView" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@vertical+block@MIT6036L11h_vert" data-graded="False" data-runtime-class="LmsRuntime">
<h2 class="hd hd-2 unit-title">Lecture: Collaborative filtering - stochastic gradient descent</h2>
<div class="vert-mod">
<div class="vert vert-0" data-id="block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11h">
<div class="xblock xblock-public_view xblock-public_view-video xmodule_display xmodule_VideoBlock" data-block-type="video" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="XBlockToXModuleShim" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11h" data-graded="False" data-runtime-class="LmsRuntime">
<script type="json/xblock-args" class="xblock-json-init-args">
{"xmodule-type": "Video"}
</script>
<h3 class="hd hd-2">Lecture: Collaborative filtering - stochastic gradient descent</h3>
<div
id="video_MIT6036L11h"
class="video closed"
data-metadata='{"saveStateEnabled": false, "autoplay": false, "publishCompletionUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11h/handler/publish_completion", "start": 0.0, "prioritizeHls": false, "saveStateUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11h/handler/xmodule_handler/save_user_state", "recordedYoutubeIsAvailable": true, "streams": "1.00:MCMVGQgecNY", "autoAdvance": false, "transcriptAvailableTranslationsUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11h/handler/transcript/available_translations", "captionDataDir": null, "ytMetadataEndpoint": "", "showCaptions": "true", "lmsRootURL": "https://openlearninglibrary.mit.edu", "transcriptTranslationUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11h/handler/transcript/translation/__lang__", "ytApiUrl": "https://www.youtube.com/iframe_api", "transcriptLanguages": {"en": "English"}, "speed": null, "autohideHtml5": false, "generalSpeed": 1.0, "transcriptLanguage": "en", "savedVideoPosition": 0.0, "poster": null, "sources": [], "duration": 0.0, "end": 0.0, "completionEnabled": false, "completionPercentage": 0.95, "ytTestTimeout": 1500}'
data-bumper-metadata='null'
data-autoadvance-enabled="False"
data-poster='null'
tabindex="-1"
>
<div class="focus_grabber first"></div>
<div class="tc-wrapper">
<div class="video-wrapper">
<span tabindex="0" class="spinner" aria-hidden="false" aria-label="Loading video player"></span>
<span tabindex="-1" class="btn-play fa fa-youtube-play fa-2x is-hidden" aria-hidden="true" aria-label="Play video"></span>
<div class="video-player-pre"></div>
<div class="video-player">
<div id="MIT6036L11h"></div>
<h4 class="hd hd-4 video-error is-hidden">No playable video sources found.</h4>
<h4 class="hd hd-4 video-hls-error is-hidden">
Your browser does not support this video format. Try using a different browser.
</h4>
</div>
<div class="video-player-post"></div>
<div class="closed-captions"></div>
<div class="video-controls is-hidden">
<div>
<div class="vcr"><div class="vidtime">0:00 / 0:00</div></div>
<div class="secondary-controls"></div>
</div>
</div>
</div>
</div>
<div class="focus_grabber last"></div>
</div>
</div>
</div>
</div>
</div>
<div class="xblock xblock-public_view xblock-public_view-vertical" data-block-type="vertical" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="VerticalStudentView" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@vertical+block@recommender_systems_collaborative_filtering_vert" data-graded="False" data-runtime-class="LmsRuntime">
<h2 class="hd hd-2 unit-title">Collaborative filtering</h2>
<div class="vert-mod">
<div class="vert vert-0" data-id="block-v1:MITx+6.036+1T2019+type@html+block@recommender_systems_collaborative_filtering">
<div class="xblock xblock-public_view xblock-public_view-html xmodule_display xmodule_HtmlBlock" data-block-type="html" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="XBlockToXModuleShim" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@html+block@recommender_systems_collaborative_filtering" data-graded="False" data-runtime-class="LmsRuntime">
<script type="json/xblock-args" class="xblock-json-init-args">
{"xmodule-type": "HTMLModule"}
</script>
<p>
There are two difficulties with content-based recommendation systems: </p><ul class="itemize"><li><p>
It's hard to design a good feature set to represent movies. </p></li><li><p>
They only use your previous movie ratings, but don't have a way to use the vast majority of their data, which is ratings from other people. </p></li></ul><p>
In collaborative filtering, we'll try to use <em>all</em> the ratings that other people have made of movies to help make better predictions for you. </p><p>
Intuitively, we can see this process as finding the kinds of people who like the kinds of movies I like, and then predicting that I will like other movies <span options="" class="marginote"><span class="marginote_desc" style="display:none">In fact, there's a third strategy that is really directly based on this idea, in which we concretely try to find other users who are our “nearest neighbors" in movie preferences, and then predict movies they like. The approach we discuss here has similar motivations but is more robust.</span><span>that they like. </span></span> </p><p>
Formally, we will start <span options="" class="marginote"><span class="marginote_desc" style="display:none">We will in fact not <em>actually</em> represent the whole data matrix explicitly—it would be too big. But it's useful to think about.</span><span>by constructing a </span></span> <em>data matrix</em> [mathjaxinline]Y[/mathjaxinline], where [mathjaxinline]Y_{ai}[/mathjaxinline] represents the score given by user [mathjaxinline]a[/mathjaxinline] to movie [mathjaxinline]i[/mathjaxinline]. So, if we have [mathjaxinline]n[/mathjaxinline] users and [mathjaxinline]m[/mathjaxinline] movies, [mathjaxinline]Y[/mathjaxinline] has shape [mathjaxinline]n \times m[/mathjaxinline]. </p><center><p><img src="/assets/courseware/v1/bd991043a4255de7186f0efcf9031df9/asset-v1:MITx+6.036+1T2019+type@asset+block/images_recommender_systems_collaborative_filtering_tikzpicture_1-crop.png" width="550"/></p></center><p>
[mathjaxinline]Y[/mathjaxinline] is very sparse (most entries are empty). <span options="" class="marginote"><span class="marginote_desc" style="display:none">In the Netflix challenge data set, there a re 400,000 users and 17,000 movies. Only 1% of the data matrix is filled.</span><span>note</span></span> So, we will think of our training data-set as [mathjaxinline]D = \left\{ (a,i,r)\right\}[/mathjaxinline], a set of tuples, where [mathjaxinline]a[/mathjaxinline] is the index assigned to a particular user, [mathjaxinline]i[/mathjaxinline] is the index assigned to a particular movie, and [mathjaxinline]r[/mathjaxinline] is user [mathjaxinline]a[/mathjaxinline]'s rating of movie [mathjaxinline]i[/mathjaxinline]. </p><p>
We are going to try to find a way to use [mathjaxinline]D[/mathjaxinline] to predict values for missing entries. Let [mathjaxinline]X[/mathjaxinline] be our predicted matrix of ratings. Now, we need to find a loss function that relates [mathjaxinline]X[/mathjaxinline] and [mathjaxinline]Y[/mathjaxinline], so that we can try to optimize it to find a good predictive model. </p><p><span style="color:ForestGreen"><b class="bf">Idea #1</b></span></p><p>
Following along with our previous approaches to designing loss functions, we might want to say that our predictions [mathjaxinline]X_{ai}[/mathjaxinline] should agree with our data [mathjaxinline]Y_{ai}[/mathjaxinline], and then add some regularization, yielding loss function </p><table id="a0000000005" class="equation" width="100%" cellspacing="0" cellpadding="7" style="table-layout:auto"><tr><td class="equation" style="width:80%; border:none">[mathjax]\text {Loss}\text {}(X, Y) = \frac{1}{2} \sum _{(a,i) \in D} (Y_{ai} - X_{ai})^2 + \sum _{\text {all } (a,i)}X_{ai}^2\; \; .[/mathjax]</td><td class="eqnnum" style="width:20%; border:none"> </td></tr></table><p><em>This is a <b class="bf">bad</b> idea!</em> It will set [mathjaxinline]X_{ai} = 0[/mathjaxinline] for all [mathjaxinline](a, i) \not\in D[/mathjaxinline]. <br/> <br/><span style="color:#FF0000"><b class="bf">Study Question:</b></span> <span style="color:#0000FF">Convince yourself of that!</span> <br/>We need to find a different kind of regularization that will force some generalization to unseen entries. </p><p><div style="border-radius:10px;padding:5px;border-style:solid;background-color:rgba(0,255,0,0.03);" class="examplebox"><p><span style="color:ForestGreen"><b class="bf">Linear algebra idea:</b></span></p><p>
The <em>rank</em> of a matrix is the maximum number of linearly independent rows in the matrix (which is equal to the maximum number of linearly independent columns in the matrix). </p><p>
If an [mathjaxinline]n \times m[/mathjaxinline] matrix [mathjaxinline]X[/mathjaxinline] is rank 1, then there exist [mathjaxinline]U[/mathjaxinline] and [mathjaxinline]V[/mathjaxinline] of shapes [mathjaxinline]n \times 1[/mathjaxinline] and [mathjaxinline]m \times 1[/mathjaxinline], respectively, such that </p><table id="a0000000006" class="equation" width="100%" cellspacing="0" cellpadding="7" style="table-layout:auto"><tr><td class="equation" style="width:80%; border:none">[mathjax]X = UV^ T\; \; .[/mathjax]</td><td class="eqnnum" style="width:20%; border:none"> </td></tr></table><p>
If [mathjaxinline]X[/mathjaxinline] is rank [mathjaxinline]k[/mathjaxinline], then there exist [mathjaxinline]U[/mathjaxinline] and [mathjaxinline]V[/mathjaxinline] of shape [mathjaxinline]n \times k[/mathjaxinline] and [mathjaxinline]m \times k[/mathjaxinline], respectively, such that </p><table id="a0000000007" class="equation" width="100%" cellspacing="0" cellpadding="7" style="table-layout:auto"><tr><td class="equation" style="width:80%; border:none">[mathjax]X = UV^ T\; \; .[/mathjax]</td><td class="eqnnum" style="width:20%; border:none"> </td></tr></table></div></p><p><span style="color:ForestGreen"><b class="bf">Idea #2</b></span></p><p>
Find the rank 1 matrix [mathjaxinline]X[/mathjaxinline] that fits the entries in [mathjaxinline]Y[/mathjaxinline] as well as possible. This is a much lower-dimensional representation (it has [mathjaxinline]m + n[/mathjaxinline] parameters rather than [mathjaxinline]m \cdot n[/mathjaxinline] parameters) and the same parameter is shared among many predictions, so it seems like it might have better generalization properties than our previous idea. </p><p>
So, we would need to find vectors [mathjaxinline]U[/mathjaxinline] and [mathjaxinline]V[/mathjaxinline] such that </p><table id="a0000000008" class="equation" width="100%" cellspacing="0" cellpadding="7" style="table-layout:auto"><tr><td class="equation" style="width:80%; border:none">[mathjax]UV^ T = \begin{bmatrix} U^{(1)} \\ \vdots \\ U^{(n)} \end{bmatrix} \begin{bmatrix} V^{(1)} & \cdots & V^{(m)} \end{bmatrix} = \begin{bmatrix} U^{(1)}V^{(1)} & \cdots & U^{(1)}V^{(m)} \\ \vdots & \ddots & \vdots \\ U^{(n)}V^{(1)} & \cdots & U^{(n)}V^{(m)} \\ \end{bmatrix} = X \; \; .[/mathjax]</td><td class="eqnnum" style="width:20%; border:none"> </td></tr></table><p>
And, since we're using squared loss, our objective function would be </p><table id="a0000000009" class="equation" width="100%" cellspacing="0" cellpadding="7" style="table-layout:auto"><tr><td class="equation" style="width:80%; border:none">[mathjax]J(U,V) = \frac{1}{2} \sum _{(a,i)\in D}(U^{(a)}V^{(i)} - Y_{ai})^2 \; \; .[/mathjax]</td><td class="eqnnum" style="width:20%; border:none"> </td></tr></table><p>
Now, how can we find the optimal values of [mathjaxinline]U[/mathjaxinline] and [mathjaxinline]V[/mathjaxinline]? We could take inspiration from our work on linear regression and see what the gradients of [mathjaxinline]J[/mathjaxinline] are with respect to the parameters in [mathjaxinline]U[/mathjaxinline] and [mathjaxinline]V[/mathjaxinline]. For example, </p><table id="a0000000010" class="equation" width="100%" cellspacing="0" cellpadding="7" style="table-layout:auto"><tr><td class="equation" style="width:80%; border:none">[mathjax]\frac{\partial J}{\partial U^{(a)}} = \sum _{i,\text { for }(a,i)\in D} (U^{(a)}V^{(i)} - Y_{ai})V^{(i)} \; \; .[/mathjax]</td><td class="eqnnum" style="width:20%; border:none"> </td></tr></table><p>
We could get an equation like this for each parameter [mathjaxinline]U^{(a)}[/mathjaxinline] or [mathjaxinline]V^{(i)}[/mathjaxinline]. We don't know how to get an immediate analytic solution to this set of equations because the parameters [mathjaxinline]U[/mathjaxinline] and [mathjaxinline]V[/mathjaxinline] are multiplied by one another in the predictions, so the model does not have a linear dependence on the parameters. We could approach this problem using gradient descent, though, and we'll do that with a related model in the next section. </p><p>
But, before we talk about optimization, let's think about the expressiveness of this model. It has one parameter per user (the elements of [mathjaxinline]U[/mathjaxinline]) and one parameter per movie (the elements of [mathjaxinline]V[/mathjaxinline]), and the predicted rating is the product of these two. It can really represent only each user's general enthusiasm and each movie's general popularity, and predict the user's rating of the movie to be the product of these values. <br/> <br/><span style="color:#FF0000"><b class="bf">Study Question:</b></span> <span style="color:#0000FF"> What if we had two users, 1 and 2, and two movies, A and B. Can you find [mathjaxinline]U, V[/mathjaxinline] that represents the data set [mathjaxinline](1, A, 1), (1, B, 5), (2, A, 5), (2, B, 1)[/mathjaxinline] well? </span> <br/></p><p><span style="color:ForestGreen"><b class="bf">Idea #3</b></span></p><p>
If using a rank 1 decomposition of the matrix is not expressive enough, maybe we can try a <em>rank [mathjaxinline]k[/mathjaxinline]</em> decomposition! In this case, we would try to find an [mathjaxinline]n\times k[/mathjaxinline] matrix [mathjaxinline]U[/mathjaxinline] and an [mathjaxinline]m \times k[/mathjaxinline] matrix [mathjaxinline]V[/mathjaxinline] that minimize </p><table id="a0000000011" class="equation" width="100%" cellspacing="0" cellpadding="7" style="table-layout:auto"><tr><td class="equation" style="width:80%; border:none">[mathjax]J(U,V) = \frac{1}{2} \sum _{(a,i)\in D} (U^{(a)} \cdot V^{(i)} - Y_{ai})^2\; \; .[/mathjax]</td><td class="eqnnum" style="width:20%; border:none"> </td></tr></table><center><p><img src="/assets/courseware/v1/b75d4b3e301f108ea5680b6bedc37543/asset-v1:MITx+6.036+1T2019+type@asset+block/images_recommender_systems_collaborative_filtering_tikzpicture_2-crop.png" width="641"/></p></center><p>
Here, the length [mathjaxinline]k[/mathjaxinline] vector [mathjaxinline]U^{(a)}[/mathjaxinline] is the [mathjaxinline]a^{th}[/mathjaxinline] row of [mathjaxinline]U[/mathjaxinline], and represents the [mathjaxinline]k[/mathjaxinline] “features" of person [mathjaxinline]a[/mathjaxinline]. Likewise, the length [mathjaxinline]k[/mathjaxinline] vector [mathjaxinline]V^{(i)}[/mathjaxinline] is the [mathjaxinline]i^{th}[/mathjaxinline] row of [mathjaxinline]V[/mathjaxinline], and represents the [mathjaxinline]k[/mathjaxinline] “features" of movie [mathjaxinline]i[/mathjaxinline]. Performing the matrix multiplication [mathjaxinline]X = UV^ T[/mathjaxinline], we see what the prediction for person [mathjaxinline]a[/mathjaxinline] and movie [mathjaxinline]i[/mathjaxinline] is [mathjaxinline]X_{ai} = U^{(a)} \cdot V^{(i)}[/mathjaxinline]. </p><p>
The total number of parameters that we have is [mathjaxinline]nk + mk[/mathjaxinline]. But, it is a redundant representation. We have 1 extra scaling parameter when [mathjaxinline]k=1[/mathjaxinline], and [mathjaxinline]k^2[/mathjaxinline] extra parameters in general. So, we really effectively have [mathjaxinline]nk + mk - k^2[/mathjaxinline] “degrees of freedom." <br/> <br/><span style="color:#FF0000"><b class="bf">Study Question:</b></span> <span style="color:#0000FF">Imagine [mathjaxinline]k = 3[/mathjaxinline]. If we were to take the matrix [mathjaxinline]U[/mathjaxinline] and multiply the first column by 2, the second column by 3 and the third column by 4, to make a new matrix [mathjaxinline]U'[/mathjaxinline], what would we have to do to [mathjaxinline]V[/mathjaxinline] to get a [mathjaxinline]V'[/mathjaxinline] so that [mathjaxinline]U'{V'}^ T = UV^ T[/mathjaxinline]? How does this question relate to the comments above about redundancy?</span> <br/></p><p>
It is still useful to add offsets to our predictions, so we will include an [mathjaxinline]n \times 1[/mathjaxinline] vector [mathjaxinline]b_ U[/mathjaxinline] and an [mathjaxinline]m \times 1[/mathjaxinline] vector [mathjaxinline]b_ V[/mathjaxinline] of offset parameters, and perform regularization on the parameters in [mathjaxinline]U[/mathjaxinline] and [mathjaxinline]V[/mathjaxinline]. So our final objective becomes </p><table id="a0000000012" class="equation" width="100%" cellspacing="0" cellpadding="7" style="table-layout:auto"><tr><td class="equation" style="width:80%; border:none">[mathjax]J(U,V) = \frac{1}{2} \sum _{(a,i)\in D} (U^{(a)} \cdot V^{(i)} + b_ U^{(a)} + b_ V^{(i)} - Y_{ai})^2 + \frac{\lambda }{2} \sum _{a=1}^ n \left\lVert U^{(a)}\right\rVert ^2 + \frac{\lambda }{2} \sum _{i=1}^ m \left\lVert V^{(i)}\right\rVert ^2 \; \; .[/mathjax]</td><td class="eqnnum" style="width:20%; border:none"> </td></tr></table><p>
<br/> <br/><span style="color:#FF0000"><b class="bf">Study Question:</b></span> <span style="color:#0000FF">What would be an informal interpretation of [mathjaxinline]b_ U^{(a)}[/mathjaxinline]? Of [mathjaxinline]b_ V^{(i)}[/mathjaxinline]?</span> <br/></p><p><h3>Optimization</h3> Now that we have an objective, it's time to optimize! There are two reasonable approaches to finding [mathjaxinline]U[/mathjaxinline], [mathjaxinline]V[/mathjaxinline], [mathjaxinline]b_ U[/mathjaxinline], and [mathjaxinline]b_ V[/mathjaxinline] that optimize this objective: alternating least squares (ALS), which builds on our analytical solution approach for linear regression, and stochastic gradient descent (SGD), which we have used in the context of neural networks and other models. </p><p><h4>Alternating least squares</h4> One interesting thing to notice is that, if we were to fix [mathjaxinline]U[/mathjaxinline] and [mathjaxinline]b_ U[/mathjaxinline], then finding the minimizing [mathjaxinline]V[/mathjaxinline] and [mathjaxinline]b_ V[/mathjaxinline] is a linear regression problem that we already know how to solve. The same is true if we were to fix [mathjaxinline]V[/mathjaxinline] and [mathjaxinline]b_ V[/mathjaxinline], and seek [mathjaxinline]U[/mathjaxinline] and [mathjaxinline]b_ U[/mathjaxinline]. So, we will consider an algorithm that takes alternating steps of this form: we fix [mathjaxinline]U, b_ U[/mathjaxinline], initially randomly, find the best [mathjaxinline]V, b_ V[/mathjaxinline]; then fix those and find the best [mathjaxinline]U, b_ U[/mathjaxinline], etc. </p><p>
This is a kind of optimization sometimes called “coordinate descent," because we only improve the model in one (or, in this case, a set of) coordinates of the parameter space at a time. Generally, coordinate ascent has similar kinds of convergence properties as gradient descent, and it cannot guarantee that we find a global optimum. It is an appealing choice in this problem because we know how to directly move to the optimal values of one set of coordinates given that the other is fixed. </p><p>
More concretely, we: </p><ol class="enumerate"><li value="1"><p>
Initialize [mathjaxinline]V[/mathjaxinline] and [mathjaxinline]b_ V[/mathjaxinline] at random </p></li><li value="2"><p>
For each [mathjaxinline]a[/mathjaxinline] in [mathjaxinline]1, 2, \ldots , n[/mathjaxinline]: </p><ul class="itemize"><li><p>
Construct a linear regression problem to find [mathjaxinline]U^{(a)}[/mathjaxinline] to minimize </p><table id="a0000000013" class="equation" width="100%" cellspacing="0" cellpadding="7" style="table-layout:auto"><tr><td class="equation" style="width:80%; border:none">[mathjax]\frac{1}{2}\sum _{\{ i \mid (a,i) \in D\} } \left(U^{(a)}\cdot V^{(i)} + b_ U^{(a)} + b_ V^{(i)} - Y_{ai}\right)^2 + \frac{\lambda }{2}\left\lVert U^{(a)}\right\rVert ^2 \; \; .[/mathjax]</td><td class="eqnnum" style="width:20%; border:none"> </td></tr></table></li><li><p>
Recall minimizing the least squares objective (we are ignoring the offset and regularizer in the following so you can see the basic idea): </p><table id="a0000000014" class="equation" width="100%" cellspacing="0" cellpadding="7" style="table-layout:auto"><tr><td class="equation" style="width:80%; border:none">[mathjax](W\theta - T)^ T(W\theta - T)\; \; .[/mathjax]</td><td class="eqnnum" style="width:20%; border:none"> </td></tr></table><p>
In this scenario, </p><ul class="itemize"><li><p>
[mathjaxinline]\theta = U^{(a)}[/mathjaxinline] is the [mathjaxinline]k \times 1[/mathjaxinline] parameter vector that we are trying to find, </p></li><li><p>
[mathjaxinline]T[/mathjaxinline] is a [mathjaxinline]m_ a \times 1[/mathjaxinline] vector of target values (for the [mathjaxinline]m_ a[/mathjaxinline] movies [mathjaxinline]a[/mathjaxinline] has rated), and </p></li><li><p>
[mathjaxinline]W[/mathjaxinline] is the [mathjaxinline]m_ a \times k[/mathjaxinline] matrix whose rows are the [mathjaxinline]V^{(i)}[/mathjaxinline] where [mathjaxinline]a[/mathjaxinline] has rated movie [mathjaxinline]i[/mathjaxinline]. </p></li></ul><p>
The solution to the least squares problem using ridge regression is our new [mathjaxinline]U^{(a)}[/mathjaxinline] and [mathjaxinline]b_ U^{(a)}[/mathjaxinline]. </p></li></ul></li><li value="3"><p>
For each [mathjaxinline]i[/mathjaxinline] in [mathjaxinline]1, 2, \ldots , m[/mathjaxinline] </p><ul class="itemize"><li><p>
Construct a linear regression problem to find [mathjaxinline]V^{(i)}[/mathjaxinline] and [mathjaxinline]b_ V^{(i)}[/mathjaxinline] to minimize </p><table id="a0000000015" class="equation" width="100%" cellspacing="0" cellpadding="7" style="table-layout:auto"><tr><td class="equation" style="width:80%; border:none">[mathjax]\frac{1}{2}\sum _{\{ i \mid (a,i) \in D\} } \left(U^{(a)}\cdot V^{(i)} + b_ U^{(a)} + b_ V^{(i)} - Y_{ai}\right)^2 + \frac{\lambda }{2}\left\lVert V^{(i)}\right\rVert ^2[/mathjax]</td><td class="eqnnum" style="width:20%; border:none"> </td></tr></table></li><li><p>
Now, [mathjaxinline]\theta = V^{(i)}[/mathjaxinline] is a [mathjaxinline]k \times 1[/mathjaxinline] parameter vector, [mathjaxinline]T[/mathjaxinline] is a [mathjaxinline]n_ i \times 1[/mathjaxinline] target vector (for the [mathjaxinline]n_ i[/mathjaxinline] users that have rated movie [mathjaxinline]i[/mathjaxinline]), and [mathjaxinline]W[/mathjaxinline] is the [mathjaxinline]n_ i \times k[/mathjaxinline] matrix whose rows are the [mathjaxinline]U^{(a)}[/mathjaxinline] where [mathjaxinline]i[/mathjaxinline] has been rated by user [mathjaxinline]a[/mathjaxinline]. </p><p>
Again, we solve using ridge regression for a new value of [mathjaxinline]V^{(i)}[/mathjaxinline] and [mathjaxinline]b_ V^{(i)}[/mathjaxinline]. </p></li></ul></li><li value="4"><p>
Alternate between steps 2 and 3, optimizing [mathjaxinline]U[/mathjaxinline] and [mathjaxinline]V[/mathjaxinline], and stop after a fixed number of iterations or when the difference between successive parameter estimates is small. </p></li></ol><p><h4>Stochastic gradient descent</h4> Finally, we can approach this problem using stochastic gradient descent. It's easier to think about if we reorganize the objective function to be </p><table id="a0000000016" class="equation" width="100%" cellspacing="0" cellpadding="7" style="table-layout:auto"><tr><td class="equation" style="width:80%; border:none">[mathjax]J(U,V) = \frac{1}{2} \sum _{(a,i)\in D} \left(\left( U^{(a)} \cdot V^{(i)} + b_ U^{(a)} + b_ V^{(i)} - Y_{ai}\right)^2 + \lambda _ U^{(a)} \left\lVert U^{(a)}\right\rVert ^2 + \lambda _ V^{(i)}\left\lVert V^{(i)}\right\rVert ^2 \right)[/mathjax]</td><td class="eqnnum" style="width:20%; border:none"> </td></tr></table><p>
where </p><table id="a0000000017" cellpadding="7" width="100%" cellspacing="0" class="eqnarray" style="table-layout:auto"><tr id="a0000000018"><td style="width:40%; border:none"> </td><td style="vertical-align:middle; text-align:right; border:none">
[mathjaxinline]\displaystyle \lambda _ U^{(a)}[/mathjaxinline]
</td><td style="vertical-align:middle; text-align:left; border:none">
[mathjaxinline]\displaystyle = \frac{\lambda }{\# \text { times }(a, \_ ) \in D} = \frac{\lambda }{\sum _{\{ i \mid (a,i) \in D\} } 1}[/mathjaxinline]
</td><td style="width:40%; border:none"> </td><td style="width:20%; border:none" class="eqnnum"> </td></tr><tr id="a0000000019"><td style="width:40%; border:none"> </td><td style="vertical-align:middle; text-align:right; border:none">
[mathjaxinline]\displaystyle \lambda _ V^{(i)}[/mathjaxinline]
</td><td style="vertical-align:middle; text-align:left; border:none">
[mathjaxinline]\displaystyle = \frac{\lambda }{\# \text { times } (\_ , i) \in D} = \frac{\lambda }{\sum _{\{ a \mid (a,i) \in D\} } 1}[/mathjaxinline]
</td><td style="width:40%; border:none"> </td><td style="width:20%; border:none" class="eqnnum"> </td></tr></table><p>
Then, </p><table id="a0000000020" cellpadding="7" width="100%" cellspacing="0" class="eqnarray" style="table-layout:auto"><tr id="a0000000021"><td style="width:40%; border:none"> </td><td style="vertical-align:middle; text-align:right; border:none">
[mathjaxinline]\displaystyle \frac{\partial J(U,V)}{\partial U^{(a)}}[/mathjaxinline]
</td><td style="vertical-align:middle; text-align:left; border:none">
[mathjaxinline]\displaystyle = \sum _{\{ i \mid (a,i) \in D\} } \left[\left(U^{(a)} \cdot V^{(i)} + b_ U^{(a)} + b_ V^{(i)} - Y_{ai}\right) V^{(i)} + \lambda _ U^{(a)}U^{(a)}\right][/mathjaxinline]
</td><td style="width:40%; border:none"> </td><td style="width:20%; border:none" class="eqnnum"> </td></tr><tr id="a0000000022"><td style="width:40%; border:none"> </td><td style="vertical-align:middle; text-align:right; border:none">
[mathjaxinline]\displaystyle \frac{\partial J(U,V)}{\partial b_ U^{(a)}}[/mathjaxinline]
</td><td style="vertical-align:middle; text-align:left; border:none">
[mathjaxinline]\displaystyle = \sum _{\{ i \mid (a,i) \in D\} } \left( U^{(a)} \cdot V^{(i)} + b_ U^{(a)} + b_ V^{(i)} - Y_{ai}\right)[/mathjaxinline]
</td><td style="width:40%; border:none"> </td><td style="width:20%; border:none" class="eqnnum"> </td></tr></table><p>
We can similarly obtain gradients with respect to [mathjaxinline]V^{(i)}[/mathjaxinline] and [mathjaxinline]b_ V^{(i)}[/mathjaxinline]. </p><p>
Then, to do gradient descent, we draw an example [mathjaxinline](a, i, Y_{ai})[/mathjaxinline] from [mathjaxinline]D[/mathjaxinline] at random, and do gradient updates on [mathjaxinline]U^{(a)}[/mathjaxinline], [mathjaxinline]b_ U^{(a)}[/mathjaxinline], [mathjaxinline]V^{(i)}[/mathjaxinline], and [mathjaxinline]b_ V^{(i)}[/mathjaxinline]. <br/> <br/><span style="color:#FF0000"><b class="bf">Study Question:</b></span> <span style="color:#0000FF">Why don't we update the other parameters, such as [mathjaxinline]U^{(a')}[/mathjaxinline] for some other user [mathjaxinline]a'[/mathjaxinline] or [mathjaxinline]V^{(i')}[/mathjaxinline] for some other movie [mathjaxinline]i'[/mathjaxinline]?</span> <br/></p><p>
<br/></p><p>
<br/></p><p><a href="/assets/courseware/v1/d47d5e8f3dc7157f83382f72e103f8e4/asset-v1:MITx+6.036+1T2019+type@asset+block/notes_chapter_Recommender_systems.pdf" target="_blank">Download this chapter as a PDF file</a></p><script src="/assets/courseware/v1/1ab2c06aefab58693cfc9c10394b7503/asset-v1:MITx+6.036+1T2019+type@asset+block/marginotes.js" type="text/javascript"/><span><br/><span style="color:gray;font-size:10pt"><center>This page was last updated on Friday May 24, 2019; 02:29:50 PM (revision 4f166135)</center></span></span>
</div>
</div>
</div>
</div>
<div class="xblock xblock-public_view xblock-public_view-vertical" data-block-type="vertical" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="VerticalStudentView" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@vertical+block@MIT6036L11j_vert" data-graded="False" data-runtime-class="LmsRuntime">
<h2 class="hd hd-2 unit-title">Lecture: Demo example - RNNs</h2>
<div class="vert-mod">
<div class="vert vert-0" data-id="block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11j">
<div class="xblock xblock-public_view xblock-public_view-video xmodule_display xmodule_VideoBlock" data-block-type="video" data-has-score="False" data-runtime-version="1" data-course-id="course-v1:MITx+6.036+1T2019" data-init="XBlockToXModuleShim" data-request-token="9bfa018e03e911f099b702fa081815af" data-usage-id="block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11j" data-graded="False" data-runtime-class="LmsRuntime">
<script type="json/xblock-args" class="xblock-json-init-args">
{"xmodule-type": "Video"}
</script>
<h3 class="hd hd-2">Lecture: Demo example - RNNs</h3>
<div
id="video_MIT6036L11j"
class="video closed"
data-metadata='{"saveStateEnabled": false, "autoplay": false, "publishCompletionUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11j/handler/publish_completion", "start": 0.0, "prioritizeHls": false, "saveStateUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11j/handler/xmodule_handler/save_user_state", "recordedYoutubeIsAvailable": true, "streams": "1.00:K9MkK8FylwA", "autoAdvance": false, "transcriptAvailableTranslationsUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11j/handler/transcript/available_translations", "captionDataDir": null, "ytMetadataEndpoint": "", "showCaptions": "true", "lmsRootURL": "https://openlearninglibrary.mit.edu", "transcriptTranslationUrl": "/courses/course-v1:MITx+6.036+1T2019/xblock/block-v1:MITx+6.036+1T2019+type@video+block@MIT6036L11j/handler/transcript/translation/__lang__", "ytApiUrl": "https://www.youtube.com/iframe_api", "transcriptLanguages": {"en": "English"}, "speed": null, "autohideHtml5": false, "generalSpeed": 1.0, "transcriptLanguage": "en", "savedVideoPosition": 0.0, "poster": null, "sources": [], "duration": 0.0, "end": 0.0, "completionEnabled": false, "completionPercentage": 0.95, "ytTestTimeout": 1500}'
data-bumper-metadata='null'
data-autoadvance-enabled="False"
data-poster='null'
tabindex="-1"
>
<div class="focus_grabber first"></div>
<div class="tc-wrapper">
<div class="video-wrapper">
<span tabindex="0" class="spinner" aria-hidden="false" aria-label="Loading video player"></span>
<span tabindex="-1" class="btn-play fa fa-youtube-play fa-2x is-hidden" aria-hidden="true" aria-label="Play video"></span>
<div class="video-player-pre"></div>
<div class="video-player">
<div id="MIT6036L11j"></div>
<h4 class="hd hd-4 video-error is-hidden">No playable video sources found.</h4>
<h4 class="hd hd-4 video-hls-error is-hidden">
Your browser does not support this video format. Try using a different browser.
</h4>
</div>
<div class="video-player-post"></div>
<div class="closed-captions"></div>
<div class="video-controls is-hidden">
<div>
<div class="vcr"><div class="vidtime">0:00 / 0:00</div></div>
<div class="secondary-controls"></div>
</div>
</div>
</div>
</div>
<div class="focus_grabber last"></div>
</div>
</div>
</div>
</div>
</div>
© All Rights Reserved