{"id":30028,"date":"2019-10-31T21:33:18","date_gmt":"2019-10-31T18:33:18","guid":{"rendered":"https:\/\/prohoster.info\/blog\/rabotaem-s-nejrosetyami-chek-list-dlya-otladki\/"},"modified":"2019-10-31T21:33:18","modified_gmt":"2019-10-31T18:33:18","slug":"rabotaem-s-nejrosetyami-chek-list-dlya-otladki","status":"publish","type":"post","link":"https:\/\/prohoster.info\/en\/blog\/rabotaem-s-nejrosetyami-chek-list-dlya-otladki","title":{"rendered":"Working with neural networks: a checklist for debugging","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Working with neural networks: a checklist for debugging\" src=\"\/wp-content\/uploads\/2019\/03\/8ce45093bfe44092cb25d947c32bb0b5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nThe code of software products for machine learning can often be complex and quite confusing. Detecting and fixing bugs in it is a resource-intensive task. Even the simplest <noindex><a rel=\"nofollow\" href=\"https:\/\/cs.stanford.edu\/people\/eroberts\/courses\/soco\/projects\/neural-networks\/Architecture\/feedforward.html\">neural networks with direct connections<\/a><\/noindex> require a serious approach to network architecture, weight initialization, and network optimization. A small error can lead to unpleasant issues.<\/p>\n<p>This article is dedicated to the debugging algorithm for your neural networks.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Skillbox recommends:<\/b> Practical Course <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/python\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=PTNDEV&amp;utm_content=articles&amp;utm_term=neuronet\">Python Developer from Scratch<\/a><\/noindex>.<\/p>\n<p><b>Reminder:<\/b> <i>for all readers of 'Habr' - a discount of 10,000 rubles when enrolling in any Skillbox course with the promo code 'Habr'.<\/i><\/p><\/blockquote>\n<p><\/p>\n<h3>The algorithm consists of five stages:<\/h3>\n<p><\/p>\n<ul>\n<li>simple start;<\/li>\n<li>loss confirmation;<\/li>\n<li>checking intermediate results and connections;<\/li>\n<li>parameter diagnostics;<\/li>\n<li>performance monitoring.<\/li>\n<\/ul>\n<p>\nIf something seems more interesting than the rest, feel free to jump to those sections. <\/p>\n<h3>Simple Start<\/h3>\n<p>\nDebugging a neural network with a complex architecture, regularization, and a learning rate scheduler is more challenging than a standard one. We're being a bit clever here, as this point is indirectly related to debugging, but it's still an important recommendation.<\/p>\n<p>The simple start involves creating a simplified model and training it on a single dataset (point).<\/p>\n<p><b>First, we create a simplified model<\/b><\/p>\n<p>To get started quickly, we create a small network with a single hidden layer and check to ensure everything works correctly. Then we gradually complicate the model, verifying each new aspect of its structure (additional layer, parameter, etc.), and move on.<\/p>\n<p><b>Train the model on a single dataset (point)<\/b><\/p>\n<p>As a quick check of your project's operability, you can train on one or two data points to confirm whether the system works correctly. The neural network should show 100% accuracy in training and validation. If it doesn\u2019t, either the model is too small, or there\u2019s already a bug.<\/p>\n<p>Even if everything is fine, prepare the model for one or several epochs before moving on.<\/p>\n<h3>Loss Evaluation<\/h3>\n<p>\nLoss evaluation is the primary way to refine the model\u2019s performance. You need to ensure that the loss corresponds to the task, and the loss functions are assessed on the correct scale. If you are using more than one type of loss, make sure they are of the same order and properly scaled.<\/p>\n<p>It's important to pay attention to initial losses. Check how close the actual result is to the expected one, especially if the model started from a random guess. In <noindex><a rel=\"nofollow\" href=\"http:\/\/cs231n.github.io\/neural-networks-3\/#baby\">Andrei Karpathy's work, the following is suggested<\/a><\/noindex>: \u201cEnsure that you are achieving the expected result when starting with a small number of parameters. It\u2019s better to check the data loss right away (setting the degree of regularization to zero). For example, for CIFAR-10 with a Softmax classifier, we expect the initial losses to be 2.302 because the expected diffuse probability is 0.1 for each class (since there are 10 classes), and the Softmax loss is the negative logarithmic probability of the correct class as \u2013ln(0.1) = 2.302.\u201d<\/p>\n<p>For the binary example, a similar calculation is performed for each class. For instance, here are the data: 20% of 0's and 80% of 1's. The expected initial loss will be up to \u20130.2ln(0.5) \u20130.8ln(0.5) = 0.693147. If the result is greater than 1, this may indicate that the neural network weights are not properly balanced or the data is not normalized.<\/p>\n<h3>We check intermediate results and connections <\/h3>\n<p>\nTo debug a neural network, it's necessary to understand the dynamics of processes within the network and the role of individual intermediate layers, as they are interconnected. Here are typical mistakes you might encounter:<\/p>\n<ul>\n<li>incorrect expressions for gradient updates;<\/li>\n<li>weight updates are not applied;<\/li>\n<li>vanishing or exploding gradients.<\/li>\n<\/ul>\n<p>\nIf the gradient values are zero, it means that the learning rate in the optimizer is too low, or you have encountered an incorrect expression for the gradient update.<\/p>\n<p>Additionally, it\u2019s important to monitor the values of activation functions, weights, and updates of each layer. For example, the magnitude of parameter updates (weights and biases) <noindex><a rel=\"nofollow\" href=\"https:\/\/cs231n.github.io\/neural-networks-3\/#summary\">should be around 1-e3.<\/a><\/noindex>.<\/p>\n<p>There is a phenomenon known as 'Dying ReLU' or <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Vanishing_gradient_problem\">the 'vanishing gradient problem'<\/a><\/noindex>, when ReLU neurons output zero after learning a large negative value (bias) for their weights. These neurons will never be activated again anywhere in the data.<\/p>\n<p>You can use gradient checking to identify these errors by approximating the gradient using a numerical approach. If it is close to the computed gradients, then backpropagation has been implemented correctly. To create gradient checking, check out these excellent resources from CS231. <noindex><a rel=\"nofollow\" href=\"http:\/\/cs231n.github.io\/neural-networks-3\/#gradcheck\">here<\/a><\/noindex> and <noindex><a rel=\"nofollow\" href=\"http:\/\/cs231n.github.io\/optimization-1\/#gradcompute\">here<\/a><\/noindex>, as well as <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=P6EtCVrvYPU\">the lesson<\/a><\/noindex> by Andrew Ng on this topic.<\/p>\n<p><noindex>Faizan Shaikh<\/noindex> highlights three main methods for visualizing neural networks:<\/p>\n<ul>\n<li>Preliminary methods are simple techniques that show us the overall structure of the trained model. They include output of shapes or filters of individual layers of the neural network and parameters in each layer.<\/li>\n<li> Activation-based methods decode the activations of individual neurons or groups of neurons to understand their functions.<\/li>\n<li> Gradient-based methods tend to manipulate the gradients formed during the forward and backward passes when training the model (including saliency maps and class activation maps).<\/li>\n<\/ul>\n<p>\nThere are several useful tools for visualizing the activations and connections of individual layers, such as <noindex><a rel=\"nofollow\" href=\"https:\/\/conx.readthedocs.io\/en\/latest\/Getting%20Started%20with%20conx.html#What-is-ConX?\">ConX<\/a><\/noindex> and <noindex><a rel=\"nofollow\" href=\"https:\/\/www.tensorflow.org\/guide\/tensorboard_histograms\">Tensorboard<\/a><\/noindex>.<\/p>\n<p><img decoding=\"async\" alt=\"Working with neural networks: a checklist for debugging\" src=\"\/wp-content\/uploads\/2019\/03\/56e7e88983d6772ef482bc8396dd52a2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Parameter diagnostics<\/h3>\n<p>\nNeural networks have a multitude of parameters that interact with each other, complicating optimization. This section is the subject of active research among specialists, so the suggestions below should be viewed merely as advice, starting points from which to work.<\/p>\n<p><b>Batch size<\/b> (batch size) \u2014 it is necessary for the batch size to be large enough to obtain accurate gradient error estimates, but small enough for stochastic gradient descent (SGD) to manage your network. Small batch sizes will lead to rapid convergence due to noise in the learning process and subsequent optimization difficulties. This is described in more detail <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1609.04836\">here<\/a><\/noindex>.<\/p>\n<p><b>Learning rate<\/b> \u2014 if too low, it will lead to slow convergence or risk getting stuck in local minima. At the same time, a high learning rate will cause optimization divergence since you risk 'jumping' over a steep yet narrow part of the loss function. Try using learning rate scheduling to reduce it during the training of the neural network. In the CS231n course. <noindex><a rel=\"nofollow\" href=\"http:\/\/cs231n.github.io\/neural-networks-3\/\">there is a large section dedicated to this issue<\/a><\/noindex>.<\/p>\n<p><b>Gradient clipping<\/b>\u2014 is the process of clipping parameter gradients during backpropagation to a maximum value or threshold norm. It's useful for addressing issues with any exploding gradients you might encounter in the third point.<\/p>\n<p><b>Batch normalization<\/b> \u2014 is used to normalize the input data of each layer, addressing the problem of internal covariate shift. If you are using both Dropout and Batch Norm together, <noindex><a rel=\"nofollow\" href=\"https:\/\/towardsdatascience.com\/pitfalls-of-batch-norm-in-tensorflow-and-sanity-checks-for-training-networks-e86c207548c8\">refer to this article<\/a><\/noindex>.<\/p>\n<p><b>Stochastic Gradient Descent (SGD)<\/b> \u2014 there are several variations of SGD that use momentum, adaptive learning rates, and the Nesterov method. However, none of them have a clear advantage regarding training efficiency or generalization (<noindex><a rel=\"nofollow\" href=\"http:\/\/ruder.io\/optimizing-gradient-descent\/\">details here<\/a><\/noindex>).<\/p>\n<p><b>Regularization<\/b> \u2014 is crucial for building a generalizable model as it adds a penalty for model complexity or extreme parameter values. This is a way to reduce model variance without significantly increasing its bias. More <noindex><a rel=\"nofollow\" href=\"http:\/\/cs231n.github.io\/neural-networks-3\/#ratio\">detailed information \u2014 here<\/a><\/noindex>.<\/p>\n<p>To evaluate everything yourself, you need to disable regularization and assess the gradient of the loss function manually.<\/p>\n<p><b>Dropout <\/b>\u2014 is another method of regularizing your network to prevent overfitting. During training, dropout is executed only by maintaining neuron activity with some probability p (hyperparameter) or setting it to zero otherwise. As a result, the network must use a different subset of parameters for each training batch, reducing the dominance of certain parameters.<\/p>\n<p>Important: if you are using both dropout and batch normalization, be careful with the order of these operations or even their joint usage. This is still actively discussed and updated. Here are two important discussions on this topic <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/39691902\/ordering-of-batch-normalization-and-dropout\">on Stackoverflow<\/a><\/noindex> and <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1801.05134\">Arxiv<\/a><\/noindex>.<\/p>\n<h3>Check performance<\/h3>\n<p>\nThis is about documenting workflows and experiments. If nothing is documented, one can forget, for example, what learning rate or class weights are used. With proper control, one can easily review and reproduce previous experiments. This helps reduce the number of duplicate experiments.<\/p>\n<p>However, manual documentation can become a daunting task in case of large workloads. This is where tools like Comet.ml come in handy, assisting in automatically logging datasets, code changes, experiment history, and production models, including key information about your model (hyperparameters, performance metrics, and environment details).<\/p>\n<p>Neural networks can be quite sensitive to small changes, which can lead to a decline in model performance. Tracking and documenting work is the first step to standardizing the environment and modeling.<\/p>\n<p><img decoding=\"async\" alt=\"Working with neural networks: a checklist for debugging\" src=\"\/wp-content\/uploads\/2019\/03\/37b3e4ef97ea39a3d28ffca5c1dbf1e5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nI hope this post can serve as a starting point for you to begin debugging your neural network.<\/p>\n<blockquote><p><b>Skillbox recommends:<\/b><\/p>\n<ul>\n<li>Two-Year Practical Course <noindex><a rel=\"nofollow\" href=\"https:\/\/iamwebdev.skillbox.ru\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=WEBDEVPRO&amp;utm_content=articles&amp;utm_term=neuronet\">\"I am a PRO Web Developer\"<\/a><\/noindex>.<\/li>\n<li>Online Course <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/c-sharp\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=CSHDEV&amp;utm_content=articles&amp;utm_term=neuronet\">C# Developer from Scratch<\/a><\/noindex>.<\/li>\n<li>Practical Year Course <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/php\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=PHPDEV&amp;utm_content=articles&amp;utm_term=neuronet\">\"PHP Developer from 0 to PRO\"<\/a><\/noindex>.\n<\/li>\n<\/ul>\n<\/blockquote>\n<p>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/skillbox\/blog\/444684\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041a\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0434\u043b\u044f \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0447\u0430\u0441\u0442\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0442\u0430\u043d\u043d\u044b\u043c. \u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438 \u043b\u0438\u043a\u0432\u0438\u0434\u0430\u0446\u0438\u044f \u0431\u0430\u0433\u043e\u0432 \u0432 \u043d\u0435\u043c \u2014 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0435\u043c\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430. \u0414\u0430\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0435 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u0441 \u043f\u0440\u044f\u043c\u043e\u0439 \u0441\u0432\u044f\u0437\u044c\u044e \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0435\u0441\u043e\u0432, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u0442\u0438. \u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044e \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0432\u0430\u0448\u0438\u0445 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439. Skillbox \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442: [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-30028","post","type-post","status-publish","format-standard","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041a\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0434\u043b\u044f \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/en\/blog\/rabotaem-s-nejrosetyami-chek-list-dlya-otladki\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044f\u043c\u0438: \u0447\u0435\u043a-\u043b\u0438\u0441\u0442 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041a\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0434\u043b\u044f \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/en\/blog\/rabotaem-s-nejrosetyami-chek-list-dlya-otladki\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:33:18+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:33:18+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Working with neural networks: a checklist for debugging | ProHoster","description":"Machine product software code.","canonical_url":"https:\/\/prohoster.info\/en\/blog\/rabotaem-s-nejrosetyami-chek-list-dlya-otladki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044f\u043c\u0438: \u0447\u0435\u043a-\u043b\u0438\u0441\u0442 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 | ProHoster","og:description":"\u041a\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0434\u043b\u044f \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e.","og:url":"https:\/\/prohoster.info\/en\/blog\/rabotaem-s-nejrosetyami-chek-list-dlya-otladki","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:33:18+00:00","article:modified_time":"2019-10-31T18:33:18+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"30028","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-20 23:28:27","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:43:15","updated":"2026-01-20 23:28:27","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/30028","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=30028"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/30028\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=30028"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=30028"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=30028"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}