{"id":7347,"date":"2019-05-02T08:00:11","date_gmt":"2019-05-02T15:00:11","guid":{"rendered":"http:\/\/softwareengineeringdaily.com\/?p=7347"},"modified":"2019-05-01T20:38:56","modified_gmt":"2019-05-02T03:38:56","slug":"online-learning","status":"publish","type":"post","link":"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/","title":{"rendered":"Online Learning"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">Machine learning and AI are concepts that are ever-growing and are continually being integrated into the workloads of more enterprises. If you are in the software field, you probably have at least an idea on how machine learning actually happens &#8211; a certain model is trained on the training data, perhaps with cross-validation. The trained model is then measured in effectiveness using the test data. If the model is sufficiently successful on the metric of your choice, then it gets deployed to be used for any new, unseen data for future predictions.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">This process, well-known to many, is actually offline or batch machine learning. In offline learning, certain assumptions are made: it is assumed that there exist relevant and reasonably-sized data that the model can be trained on, and more importantly, the future data on which the predictions will be performed are sampled from the same distribution as the training data. This is also known as the <\/span><a href=\"https:\/\/en.wikipedia.org\/wiki\/Independent_and_identically_distributed_random_variables\"><span style=\"font-weight: 400;\">independent and identically distributed random variables (i.i.d.)<\/span><\/a><span style=\"font-weight: 400;\"> assumption. <\/span><\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" data-attachment-id=\"7349\" data-permalink=\"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/image9-4\/\" data-orig-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image9.png?fit=850%2C624&amp;ssl=1\" data-orig-size=\"850,624\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image9\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image9.png?fit=300%2C220&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image9.png?fit=850%2C624&amp;ssl=1\" class=\"aligncenter wp-image-7349\" src=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image9-300x220.png?resize=500%2C367&#038;ssl=1\" alt=\"\" width=\"500\" height=\"367\" srcset=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image9.png?resize=300%2C220&amp;ssl=1 300w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image9.png?resize=768%2C564&amp;ssl=1 768w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image9.png?w=850&amp;ssl=1 850w\" sizes=\"(max-width: 500px) 100vw, 500px\" data-recalc-dims=\"1\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Online machine learning versus batch learning. (a) Batch machine learning workflow; (b) Online machine learning workflow, from <\/span><a href=\"https:\/\/www.researchgate.net\/publication\/316818527_Effective_Information_Extraction_Framework_for_Heterogeneous_Clinical_Reports_Using_Online_Machine_Learning_and_Controlled_Vocabularies\"><span style=\"font-weight: 400;\">Zheng et.al. Effective Information Extraction Framework for Heterogeneous Clinical Reports Using Online Machine Learning and Controlled Vocabularies<\/span><\/a><\/p>\n<p><span style=\"font-weight: 400;\">These assumptions can be valid for practical settings. When analyzing the works of an author, it might be assumed that the author has a consistent writing style, and all their work inherits, in some way, this style. When building a machine learning model to predict whether a given text can be from this particular author, it can be valid to hold to the i.i.d. assumption, and train a large model on the works of the author. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">However, i.i.d. assumption does not always hold, and is not always practical. A classic example is adversarial spam filtering.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h1><b>Spam Email Filtering<\/b><\/h1>\n<p><span style=\"font-weight: 400;\">One basic example where the i.i.d. assumption doesn\u2019t hold comes in the form of an adversarially adaptive setting: spam filtering. This is a binary classification problem, where each data point, e.g. an email, is classified either as \u2018spam\u2019 or \u2018not spam\u2019. <\/span><\/p>\n<p><img decoding=\"async\" data-attachment-id=\"7350\" data-permalink=\"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/image11\/\" data-orig-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image11.png?fit=975%2C428&amp;ssl=1\" data-orig-size=\"975,428\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image11\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image11.png?fit=300%2C132&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image11.png?fit=975%2C428&amp;ssl=1\" class=\"aligncenter wp-image-7350\" src=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image11-300x132.png?resize=499%2C219&#038;ssl=1\" alt=\"\" width=\"499\" height=\"219\" srcset=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image11.png?resize=300%2C132&amp;ssl=1 300w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image11.png?resize=768%2C337&amp;ssl=1 768w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image11.png?w=975&amp;ssl=1 975w\" sizes=\"(max-width: 499px) 100vw, 499px\" data-recalc-dims=\"1\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Consider the following scenario: we have a machine learning model for spam filtering, that has been trained on a large data set, and achieves 95% accuracy. Since this accuracy is sufficiently well, the model is deployed to production. However, in time, the model\u2019s strength goes down, and it lets spam email get through. Why? <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Because people that generate spam email are playing it smart &#8211; when they notice that their emails are not being opened, or the ads are not being clicked, they tweak their content to fool the model we deployed. The future data is no longer sampled from the same distribution that we trained the model on!<\/span><\/p>\n<p><span style=\"font-weight: 400;\">This is an adversarial setting &#8211; the spammers are adversaries to our model. What is the solution? For this simple example, the solution can also be simple: the developer can manually re-train the model again as new data come in, and with a clever choice of loss function and success metric, they can put greater weight on the most recent data. Another option is to automate this process, and have the model re-trained in defined intervals, e.g. once every week, and then automatically deployed. This way, the overall performance stays relatively stable. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">For the straightforward example of email spam filtering, offline learning with automated re-training can work well. The worst that can happen is, the adversaries play it cunningly and right after a model deployment, they start sending smarter spam. Some spam emails manage to get through the model, landing on the user\u2019s inbox, until the next training phase where these new spam emails will be known to be spam. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Illustration of exploratory attacks on a machine learning based spam filtering system,<\/span><\/p>\n<p><span style=\"font-weight: 400;\">from <\/span><a href=\"https:\/\/www.researchgate.net\/publication\/323143053_A_Dynamic-Adversarial_Approach_to_the_Security_of_Machine_Learning\"><span style=\"font-weight: 400;\">Tegjyot Singh Sethi and Mehmed Kantardzic, A Dynamic-Adversarial Approach to the Security of Machine Learning<\/span><\/a><\/p>\n<p><img decoding=\"async\" data-attachment-id=\"7351\" data-permalink=\"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/image6-8\/\" data-orig-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image6.png?fit=812%2C340&amp;ssl=1\" data-orig-size=\"812,340\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image6\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image6.png?fit=300%2C126&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image6.png?fit=812%2C340&amp;ssl=1\" class=\"aligncenter wp-image-7351\" src=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image6-300x126.png?resize=499%2C209&#038;ssl=1\" alt=\"\" width=\"499\" height=\"209\" srcset=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image6.png?resize=300%2C126&amp;ssl=1 300w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image6.png?resize=768%2C322&amp;ssl=1 768w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image6.png?w=812&amp;ssl=1 812w\" sizes=\"(max-width: 499px) 100vw, 499px\" data-recalc-dims=\"1\" \/><\/p>\n<p><span style=\"font-weight: 400;\">A natural follow-up is to circumvent this problem is shortening the time intervals between training the model. The shorter the interval, the less tweaking time the adversaries will have. When taken to the extreme, this approach converges to real-time updates to the model, as time intervals approach virtually 0. This practice then becomes known as \u2018online learning\u2019.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h1><b>Online Learning<\/b><\/h1>\n<p><span style=\"font-weight: 400;\">Formally, <\/span><a href=\"https:\/\/www.cs.huji.ac.il\/~shais\/papers\/OLsurvey.pdf\"><span style=\"font-weight: 400;\">online learning is the process of answering <\/span><b>a sequence of questions<\/b><span style=\"font-weight: 400;\"> given knowledge of the correct answer to previous questions<\/span><\/a><span style=\"font-weight: 400;\">. Opposed to the classic offline machine learning, where all data points are available at training time, in online learning, data points come in sequences &#8211; we are only exposed to one data point at a time. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Online learning is performed in consecutive rounds denoted by <\/span><span style=\"font-weight: 400;\">t, <\/span><span style=\"font-weight: 400;\">where in each round the learner receives a question <\/span><span style=\"font-weight: 400;\">x<\/span><span style=\"font-weight: 400;\">t<\/span><span style=\"font-weight: 400;\">,<\/span><span style=\"font-weight: 400;\"> and subsequently provides an answer <\/span><span style=\"font-weight: 400;\">p<\/span><span style=\"font-weight: 400;\">t<\/span><span style=\"font-weight: 400;\">.<\/span><span style=\"font-weight: 400;\"> When the true answer is received, the learner suffers a loss, and the learner can update the model accordingly. <\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"7352\" data-permalink=\"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/image12-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image12-1.png?fit=1356%2C528&amp;ssl=1\" data-orig-size=\"1356,528\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image12\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image12-1.png?fit=300%2C117&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image12-1.png?fit=1024%2C399&amp;ssl=1\" class=\"aligncenter wp-image-7352\" src=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image12-1-300x117.png?resize=501%2C195&#038;ssl=1\" alt=\"\" width=\"501\" height=\"195\" srcset=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image12-1.png?resize=300%2C117&amp;ssl=1 300w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image12-1.png?resize=768%2C299&amp;ssl=1 768w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image12-1.png?resize=1024%2C399&amp;ssl=1 1024w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image12-1.png?w=1356&amp;ssl=1 1356w\" sizes=\"(max-width: 501px) 100vw, 501px\" data-recalc-dims=\"1\" \/><\/p>\n<p><span style=\"font-weight: 400;\">The notion of risk and loss is inherently different between offline and online learning. In offline learning, the risk is the expected loss over all the data points, since the data points are not sequential. In the online setting, data are seen as a sequence: the risk of the model <\/span><b>changes<\/b><span style=\"font-weight: 400;\"> with each new observation. At any point in time, <\/span><i><span style=\"font-weight: 400;\">T<\/span><\/i><span style=\"font-weight: 400;\">, the risk is <\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"7353\" data-permalink=\"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/image14\/\" data-orig-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image14.png?fit=566%2C175&amp;ssl=1\" data-orig-size=\"566,175\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image14\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image14.png?fit=300%2C93&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image14.png?fit=566%2C175&amp;ssl=1\" class=\"aligncenter size-medium wp-image-7353\" src=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image14-300x93.png?resize=300%2C93&#038;ssl=1\" alt=\"\" width=\"300\" height=\"93\" srcset=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image14.png?resize=300%2C93&amp;ssl=1 300w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image14.png?w=566&amp;ssl=1 566w\" sizes=\"(max-width: 300px) 100vw, 300px\" data-recalc-dims=\"1\" \/><\/p>\n<p><span style=\"font-weight: 400;\">where <\/span><span style=\"font-weight: 400;\">p<\/span><span style=\"font-weight: 400;\">t <\/span><span style=\"font-weight: 400;\">and <\/span><span style=\"font-weight: 400;\">y<\/span><span style=\"font-weight: 400;\">t <\/span><span style=\"font-weight: 400;\">are as described above. The overall goal is to minimize <\/span><b>regret<\/b><span style=\"font-weight: 400;\">, a different notion of cumulative loss. Regret is defined as<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"7354\" data-permalink=\"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/image13\/\" data-orig-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image13.png?fit=1022%2C163&amp;ssl=1\" data-orig-size=\"1022,163\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image13\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image13.png?fit=300%2C48&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image13.png?fit=1022%2C163&amp;ssl=1\" class=\"aligncenter wp-image-7354\" src=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image13-300x48.png?resize=401%2C64&#038;ssl=1\" alt=\"\" width=\"401\" height=\"64\" srcset=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image13.png?resize=300%2C48&amp;ssl=1 300w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image13.png?resize=768%2C122&amp;ssl=1 768w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image13.png?w=1022&amp;ssl=1 1022w\" sizes=\"(max-width: 401px) 100vw, 401px\" data-recalc-dims=\"1\" \/><\/p>\n<p><span style=\"font-weight: 400;\">What this means is that the regret of an algorithm is the difference between the risk of the given algorithm and the risk of the algorithm that can achieve the minimum risk in hindsight. This formulation makes intuitive sense: the data is coming in discrete points, so we cannot make a holistic guess. Our model can be judged by the past predictions, and we can only <\/span><b>regret<\/b><span style=\"font-weight: 400;\"> the actions that we have not taken. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">An intuitive example to this online learning setting is very well-known in the neural network area: stochastic or online gradient descent. Typically used during the optimization step of neural networks, gradient descent is an algorithm that aims to minimize a target function <\/span><a href=\"https:\/\/ml-cheatsheet.readthedocs.io\/en\/latest\/gradient_descent.html\"><span style=\"font-weight: 400;\">by iteratively moving in the direction of steepest descent as defined by the negative of the gradient<\/span><\/a><span style=\"font-weight: 400;\">. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Online gradient descent executes gradient descent by only taking a single sample, i.e. a batch size of 1, for each iteration. After obtaining a loss for this single example, the parameters, i.e. weights in neural networks, are updated according to the negative gradient of this loss. The similarity between the general pseudocode description of online learning and the algorithm for online gradient descent is apparent. <\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"7355\" data-permalink=\"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/image10\/\" data-orig-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image10.png?fit=1999%2C1398&amp;ssl=1\" data-orig-size=\"1999,1398\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image10\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image10.png?fit=300%2C210&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image10.png?fit=1024%2C716&amp;ssl=1\" class=\"aligncenter wp-image-7355\" src=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image10-300x210.png?resize=500%2C350&#038;ssl=1\" alt=\"\" width=\"500\" height=\"350\" srcset=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image10.png?resize=300%2C210&amp;ssl=1 300w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image10.png?resize=768%2C537&amp;ssl=1 768w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image10.png?resize=1024%2C716&amp;ssl=1 1024w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image10.png?w=1999&amp;ssl=1 1999w\" sizes=\"(max-width: 500px) 100vw, 500px\" data-recalc-dims=\"1\" \/><\/p>\n<p><span style=\"font-weight: 400;\">[From the slides of Wojciech Kotlowski, Institute of Computing Science, Pozna<\/span><span style=\"font-weight: 400;\">\u0144<\/span><span style=\"font-weight: 400;\"> University of Technology] <\/span><\/p>\n<h1><\/h1>\n<h1><b>When is online learning useful? <\/b><\/h1>\n<p><span style=\"font-weight: 400;\">One of the main settings that require an online learning solution are when the data are too big to train a static offline model efficiently. Out-of-core training, where the data set does not wholly fit into the main memory, is not feasible in environments with limited resources. Then, the data can be treated as an incoming stream, and processed in an online fashion. Treating each data point as a new observation and iteratively tuning the learning model makes this possible. As can be seen from this setting, online learning does not always have to be \u2018online\u2019 in the common sense. Most of the current offline learning algorithms actually deploy online learning in the optimization step, e.g. online gradient descent.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Another setting where online learning is useful is when the underlying distribution of the data drifts over time. This occurrence is also known as <\/span><b>concept drift<\/b><span style=\"font-weight: 400;\">. The changes in the distribution of the data can be attributed to numerous causes, one of the most prominent case being the adversarial setting like spam filtering. Other causes can be <\/span><a href=\"https:\/\/www.win.tue.nl\/~mpechen\/publications\/pubs\/CD_applications15.pdf\"><span style=\"font-weight: 400;\">changes in population, changes in personal interests, or the complex nature of the environment<\/span><\/a><span style=\"font-weight: 400;\">. <\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"7356\" data-permalink=\"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/image8-4\/\" data-orig-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image8.png?fit=1308%2C892&amp;ssl=1\" data-orig-size=\"1308,892\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image8\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image8.png?fit=300%2C205&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image8.png?fit=1024%2C698&amp;ssl=1\" class=\"aligncenter wp-image-7356\" src=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image8-300x205.png?resize=500%2C341&#038;ssl=1\" alt=\"\" width=\"500\" height=\"341\" srcset=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image8.png?resize=300%2C205&amp;ssl=1 300w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image8.png?resize=768%2C524&amp;ssl=1 768w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image8.png?resize=1024%2C698&amp;ssl=1 1024w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image8.png?w=1308&amp;ssl=1 1308w\" sizes=\"(max-width: 500px) 100vw, 500px\" data-recalc-dims=\"1\" \/><\/p>\n<p style=\"text-align: center;\"><span style=\"font-weight: 400;\"> Illustration of the four structural types of concept drift, <\/span><\/p>\n<p style=\"text-align: center;\"><span style=\"font-weight: 400;\">from <\/span><a href=\"https:\/\/arxiv.org\/abs\/1010.4784\"><span style=\"font-weight: 400;\">Indr\u0117 \u017dliobait\u0117, Learning under Concept Drift: an Overview<\/span><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Concept drift happens in various real-life applications. <\/span><a href=\"https:\/\/arxiv.org\/abs\/1010.4784\"><span style=\"font-weight: 400;\">\u017dliobait\u0117<\/span><\/a><span style=\"font-weight: 400;\"> divides them into four categories: monitoring control, personal assistance, decision making, and artificial intelligence. Some examples include fraudulent transaction detection in banking, customer profiling and dividing customers into non-stationary segments, forecasting in finance, and stock price prediction.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h1><b>In Practice<\/b><\/h1>\n<p><span style=\"font-weight: 400;\">Algorithms for online machine learning on streaming data is an active research area. Machine learning is a very broad area, and online machine learning can be integrated into existing paradigms, such as building <\/span><a href=\"https:\/\/arxiv.org\/pdf\/1711.03705.pdf\"><span style=\"font-weight: 400;\">online deep learning<\/span><\/a><span style=\"font-weight: 400;\"> models. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Currently, there are numerous open source approaches to building machine learning models for online settings:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><a href=\"https:\/\/moa.cms.waikato.ac.nz\/\"><span style=\"font-weight: 400;\">MOA<\/span><\/a><span style=\"font-weight: 400;\"> (Massive Online Analysis): A framework for data stream mining, written in Java. Developed at The University of Waikato, where popular machine learning framework WEKA was also developed, MOA is one of the most popular open-source tools for training machine learning models on streaming data. <\/span><a href=\"https:\/\/moa.cms.waikato.ac.nz\/details\/\"><span style=\"font-weight: 400;\">MOA currently supports<\/span><\/a><span style=\"font-weight: 400;\"> stream classification, stream clustering, outlier detection, change detection and concept drift and recommender systems.<\/span><\/li>\n<li style=\"font-weight: 400;\"><a href=\"https:\/\/scikit-multiflow.github.io\/\"><span style=\"font-weight: 400;\">scikit-multiflow<\/span><\/a><span style=\"font-weight: 400;\">: Inspired by MOA, scikit-multiflow is an open source machine learning framework for multi-output\/multi-label and stream data, developed for Python. <\/span><\/li>\n<li style=\"font-weight: 400;\"><a href=\"https:\/\/huawei-noah.github.io\/streamDM\/\"><span style=\"font-weight: 400;\">streamDM<\/span><\/a><span style=\"font-weight: 400;\">: Developed at Huawei Noah\u2019s Ark Lab, streamDM is an open-source tool for mining big data streams using <\/span><a href=\"https:\/\/spark.apache.org\/streaming\/\"><span style=\"font-weight: 400;\">Spark Streaming<\/span><\/a><span style=\"font-weight: 400;\">. <\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Another approach is through scikit-learn. Numerous classifiers from scikit-learn\u2019s model classes support a function called <\/span><span style=\"font-weight: 400;\">partial_fit()<\/span><span style=\"font-weight: 400;\">. Partial fit performs one iteration of optimization on the given samples, which in the online learning case can be a single sample. This method is used mainly for out-of-core training, where the whole training dataset cannot fit into memory. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">In production, there are a variety of other aspects to consider: setting up a streaming platform for digesting incoming streams, such as Kafka or Spark, building pipelines to preprocess the data and perform feature extraction, setting up monitoring on the prediction process, and many more.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"7358\" data-permalink=\"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/image7-6\/\" data-orig-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image7.png?fit=975%2C307&amp;ssl=1\" data-orig-size=\"975,307\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image7\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image7.png?fit=300%2C94&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image7.png?fit=975%2C307&amp;ssl=1\" class=\"aligncenter wp-image-7358\" src=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image7-300x94.png?resize=499%2C157&#038;ssl=1\" alt=\"\" width=\"499\" height=\"157\" srcset=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image7.png?resize=300%2C94&amp;ssl=1 300w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image7.png?resize=768%2C242&amp;ssl=1 768w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image7.png?w=975&amp;ssl=1 975w\" sizes=\"(max-width: 499px) 100vw, 499px\" data-recalc-dims=\"1\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Hidden technical debt in machine learning systems: <\/span><a href=\"https:\/\/papers.nips.cc\/paper\/5656-hidden-technical-debt-in-machine-learning-systems.pdf\"><span style=\"font-weight: 400;\">https:\/\/papers.nips.cc\/paper\/5656-hidden-technical-debt-in-machine-learning-systems.pdf<\/span><\/a><\/p>\n<p><span style=\"font-weight: 400;\">If deployed in an online setting, the models that have been built have to be fast to make predictions in real time and to update the model in real time, and they need to be available at all times. The task becomes especially complicated, since the model cannot be efficiently horizontally scaled &#8211; any incoming data point has to pass through a single model, and the model has to update accordingly. In a distributed scale, this would require efficient passing of parameters between models deployed in separate machines. Since the order of the data points matter in the model updates, this distributed setting becomes problematic. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Even though it\u2019s being repeated everywhere, it\u2019s nevertheless true that machine learning is growing bigger and is becoming integrated with more areas each year. There is exciting research going on in finding new paradigms within the machine learning sphere, and new frameworks and tools bring these cutting-edge machine learning concepts even closer to developers. In this rising trend within machine learning, with the growth of personalization in the online sphere, such as online customer behavior prediction and online ranking, and with the recent development in IoT, online machine learning will also start becoming more prominent. <\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Machine learning and AI are concepts that are ever-growing and are continually being integrated into the workloads of more enterprises. If you are in the software field, you probably have at least an idea on how machine learning actually happens &#8211; a certain model is trained on the training data, perhaps with cross-validation. The trained<\/p>\n","protected":false},"author":15,"featured_media":7348,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[1363,83,2143],"tags":[518,2895,2402,311,2894,2171],"class_list":["post-7347","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-all-episodes","category-articles","category-exclusive-content","tag-ai","tag-concept-drift","tag-gokhan-simsek","tag-machine-learning","tag-online-learning","tag-streaming-data"],"jetpack_publicize_connections":[],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Online Learning - Software Engineering Daily<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Online Learning - Software Engineering Daily\" \/>\n<meta property=\"og:description\" content=\"Machine learning and AI are concepts that are ever-growing and are continually being integrated into the workloads of more enterprises. If you are in the software field, you probably have at least an idea on how machine learning actually happens &#8211; a certain model is trained on the training data, perhaps with cross-validation. The trained\" \/>\n<meta property=\"og:url\" content=\"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/\" \/>\n<meta property=\"og:site_name\" content=\"Software Engineering Daily\" \/>\n<meta property=\"article:published_time\" content=\"2019-05-02T15:00:11+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-05-02T03:38:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image12.png?fit=1356%2C528&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1356\" \/>\n\t<meta property=\"og:image:height\" content=\"528\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Gokhan Simsek\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@GokhanSimseek\" \/>\n<meta name=\"twitter:site\" content=\"@software_daily\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Gokhan Simsek\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/\"},\"author\":{\"name\":\"Gokhan Simsek\",\"@id\":\"https:\/\/softwareengineeringdaily.com\/#\/schema\/person\/e890d5bb8941fc76fb69909e6702c34d\"},\"headline\":\"Online Learning\",\"datePublished\":\"2019-05-02T15:00:11+00:00\",\"dateModified\":\"2019-05-02T03:38:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/\"},\"wordCount\":1854,\"publisher\":{\"@id\":\"https:\/\/softwareengineeringdaily.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image12.png?fit=1356%2C528&ssl=1\",\"keywords\":[\"AI\",\"concept drift\",\"Gokhan Simsek\",\"Machine Learning\",\"online learning\",\"streaming data\"],\"articleSection\":[\"All Content\",\"Exclusive Articles\",\"Exclusive Content\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/\",\"url\":\"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/\",\"name\":\"Online Learning - Software Engineering Daily\",\"isPartOf\":{\"@id\":\"https:\/\/softwareengineeringdaily.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image12.png?fit=1356%2C528&ssl=1\",\"datePublished\":\"2019-05-02T15:00:11+00:00\",\"dateModified\":\"2019-05-02T03:38:56+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/#primaryimage\",\"url\":\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image12.png?fit=1356%2C528&ssl=1\",\"contentUrl\":\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image12.png?fit=1356%2C528&ssl=1\",\"width\":1356,\"height\":528},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/softwareengineeringdaily.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Online Learning\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/softwareengineeringdaily.com\/#website\",\"url\":\"https:\/\/softwareengineeringdaily.com\/\",\"name\":\"Software Engineering Daily\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/softwareengineeringdaily.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/softwareengineeringdaily.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/softwareengineeringdaily.com\/#organization\",\"name\":\"Software Engineering Daily\",\"url\":\"https:\/\/softwareengineeringdaily.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/softwareengineeringdaily.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2024\/01\/cropped-sed_website_banner.png?fit=549%2C169&ssl=1\",\"contentUrl\":\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2024\/01\/cropped-sed_website_banner.png?fit=549%2C169&ssl=1\",\"width\":549,\"height\":169,\"caption\":\"Software Engineering Daily\"},\"image\":{\"@id\":\"https:\/\/softwareengineeringdaily.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/software_daily\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/softwareengineeringdaily.com\/#\/schema\/person\/e890d5bb8941fc76fb69909e6702c34d\",\"name\":\"Gokhan Simsek\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/softwareengineeringdaily.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/9ad291f06753e23a47e536bcfe34701f?s=96&d=retro&r=pg\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/9ad291f06753e23a47e536bcfe34701f?s=96&d=retro&r=pg\",\"caption\":\"Gokhan Simsek\"},\"description\":\"Gokhan is a computer science graduate, currently pursuing a MSc. degree in Data Science at Eindhoven University of Technology.\",\"sameAs\":[\"https:\/\/x.com\/GokhanSimseek\"],\"url\":\"https:\/\/softwareengineeringdaily.com\/author\/gokhan\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Online Learning - Software Engineering Daily","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/","og_locale":"en_US","og_type":"article","og_title":"Online Learning - Software Engineering Daily","og_description":"Machine learning and AI are concepts that are ever-growing and are continually being integrated into the workloads of more enterprises. If you are in the software field, you probably have at least an idea on how machine learning actually happens &#8211; a certain model is trained on the training data, perhaps with cross-validation. The trained","og_url":"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/","og_site_name":"Software Engineering Daily","article_published_time":"2019-05-02T15:00:11+00:00","article_modified_time":"2019-05-02T03:38:56+00:00","og_image":[{"width":1356,"height":528,"url":"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image12.png?fit=1356%2C528&ssl=1","type":"image\/png"}],"author":"Gokhan Simsek","twitter_card":"summary_large_image","twitter_creator":"@GokhanSimseek","twitter_site":"@software_daily","twitter_misc":{"Written by":"Gokhan Simsek","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/#article","isPartOf":{"@id":"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/"},"author":{"name":"Gokhan Simsek","@id":"https:\/\/softwareengineeringdaily.com\/#\/schema\/person\/e890d5bb8941fc76fb69909e6702c34d"},"headline":"Online Learning","datePublished":"2019-05-02T15:00:11+00:00","dateModified":"2019-05-02T03:38:56+00:00","mainEntityOfPage":{"@id":"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/"},"wordCount":1854,"publisher":{"@id":"https:\/\/softwareengineeringdaily.com\/#organization"},"image":{"@id":"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image12.png?fit=1356%2C528&ssl=1","keywords":["AI","concept drift","Gokhan Simsek","Machine Learning","online learning","streaming data"],"articleSection":["All Content","Exclusive Articles","Exclusive Content"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/","url":"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/","name":"Online Learning - Software Engineering Daily","isPartOf":{"@id":"https:\/\/softwareengineeringdaily.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/#primaryimage"},"image":{"@id":"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image12.png?fit=1356%2C528&ssl=1","datePublished":"2019-05-02T15:00:11+00:00","dateModified":"2019-05-02T03:38:56+00:00","breadcrumb":{"@id":"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/#primaryimage","url":"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image12.png?fit=1356%2C528&ssl=1","contentUrl":"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image12.png?fit=1356%2C528&ssl=1","width":1356,"height":528},{"@type":"BreadcrumbList","@id":"https:\/\/softwareengineeringdaily.com\/2019\/05\/02\/online-learning\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/softwareengineeringdaily.com\/"},{"@type":"ListItem","position":2,"name":"Online Learning"}]},{"@type":"WebSite","@id":"https:\/\/softwareengineeringdaily.com\/#website","url":"https:\/\/softwareengineeringdaily.com\/","name":"Software Engineering Daily","description":"","publisher":{"@id":"https:\/\/softwareengineeringdaily.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/softwareengineeringdaily.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/softwareengineeringdaily.com\/#organization","name":"Software Engineering Daily","url":"https:\/\/softwareengineeringdaily.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/softwareengineeringdaily.com\/#\/schema\/logo\/image\/","url":"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2024\/01\/cropped-sed_website_banner.png?fit=549%2C169&ssl=1","contentUrl":"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2024\/01\/cropped-sed_website_banner.png?fit=549%2C169&ssl=1","width":549,"height":169,"caption":"Software Engineering Daily"},"image":{"@id":"https:\/\/softwareengineeringdaily.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/software_daily"]},{"@type":"Person","@id":"https:\/\/softwareengineeringdaily.com\/#\/schema\/person\/e890d5bb8941fc76fb69909e6702c34d","name":"Gokhan Simsek","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/softwareengineeringdaily.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/9ad291f06753e23a47e536bcfe34701f?s=96&d=retro&r=pg","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9ad291f06753e23a47e536bcfe34701f?s=96&d=retro&r=pg","caption":"Gokhan Simsek"},"description":"Gokhan is a computer science graduate, currently pursuing a MSc. degree in Data Science at Eindhoven University of Technology.","sameAs":["https:\/\/x.com\/GokhanSimseek"],"url":"https:\/\/softwareengineeringdaily.com\/author\/gokhan\/"}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2019\/05\/image12.png?fit=1356%2C528&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/p7GuoD-1Uv","_links":{"self":[{"href":"https:\/\/softwareengineeringdaily.com\/wp-json\/wp\/v2\/posts\/7347"}],"collection":[{"href":"https:\/\/softwareengineeringdaily.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/softwareengineeringdaily.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/softwareengineeringdaily.com\/wp-json\/wp\/v2\/users\/15"}],"replies":[{"embeddable":true,"href":"https:\/\/softwareengineeringdaily.com\/wp-json\/wp\/v2\/comments?post=7347"}],"version-history":[{"count":0,"href":"https:\/\/softwareengineeringdaily.com\/wp-json\/wp\/v2\/posts\/7347\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/softwareengineeringdaily.com\/wp-json\/wp\/v2\/media\/7348"}],"wp:attachment":[{"href":"https:\/\/softwareengineeringdaily.com\/wp-json\/wp\/v2\/media?parent=7347"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/softwareengineeringdaily.com\/wp-json\/wp\/v2\/categories?post=7347"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/softwareengineeringdaily.com\/wp-json\/wp\/v2\/tags?post=7347"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}