{"id":1902,"date":"2019-08-20T15:31:33","date_gmt":"2019-08-20T23:31:33","guid":{"rendered":"https:\/\/live-cometml.pantheonsite.io\/blog\/selecting-the-right-weight-initialization-for-your-deep-neural-network\/"},"modified":"2019-08-20T15:31:33","modified_gmt":"2019-08-20T23:31:33","slug":"selecting-the-right-weight-initialization-for-your-deep-neural-network","status":"publish","type":"post","link":"https:\/\/www.comet.com\/site\/blog\/selecting-the-right-weight-initialization-for-your-deep-neural-network\/","title":{"rendered":"Selecting the right weight initialization for your deep neural network"},"content":{"rendered":"\n<p>&nbsp;<\/p>\n\n\n\n<p><em>Part 1 of a two part series<\/em><\/p>\n\n\n\n<p>The weight initialization technique you choose for your neural network can determine how quickly the network converges or whether it converges at all. Although the initial values of these weights are just one parameter among many to tune, they are incredibly important. Their distribution affects the gradients and, therefore, the effectiveness of training.<\/p>\n\n\n\n<p>In neural networks, weights represent the strength of connections between units in adjacent network layers. The linear transformation of these weights and the values in the previous layer passes through a non-linear activation function to produce the values of the next layer. This process happens layer to layer during forward propagation; through back propagation, the optimum values of these weights can be found out so as to produce accurate outputs given an input.<\/p>\n\n\n\n<p><strong>In this article, we\u2019ll cover:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Why weight initialization is important<\/li>\n<li>Active areas of research around weight initialization<\/li>\n<\/ul>\n\n\n\n<p><em>We will not be covering mathematical derivations of these initialization approaches. If you are interested in this type of material, we do link to several great resources within and at the end of the article (in the \u2018Further Reading\u2019 section)<\/em> .<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Why is weight initialization important?<\/h3>\n\n\n\n<p>Improperly initialized weights can negatively affect the training process by contributing to the\u00a0<strong>vanishing<\/strong>\u00a0or\u00a0<strong>exploding gradient problem.\u00a0<\/strong>With the vanishing gradient problem, the weight update is minor and results in slower convergence \u2014 this makes the optimization of the loss function slow and in a worst case scenario, may stop the network from converging altogether. Conversely, initializing with weights that are too large may result in exploding gradient values during forward propagation or back-propagation (see more\u00a0<a href=\"https:\/\/medium.com\/usf-msds\/deep-learning-best-practices-1-weight-initialization-14e5c0295b94\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>).<\/p>\n\n\n\n<p><a href=\"http:\/\/deeplearning.ai\/\" target=\"_blank\" rel=\"noreferrer noopener\">Deeplearning.ai<\/a>\u00a0recently published<a href=\"https:\/\/www.deeplearning.ai\/ai-notes\/initialization\/\" target=\"_blank\" rel=\"noreferrer noopener\">\u00a0an interactive post<\/a>\u00a0where you can choose different initialization methods and watch the network train. Here\u2019s an example:<\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" class=\"wp-image-634\" src=\"https:\/\/i0.wp.com\/blog.comet.ml\/wp-content\/uploads\/2019\/10\/deep-learning.gif?fit=769%2C376&amp;ssl=1\" alt=\"\" \/><\/figure>\n<\/div>\n\n\n\n<p>You\u2019ll notice how setting an initialization method that\u2019s too small barely allows the network to learn (ie. reduce the cost function) while an initialization method that\u2019s too large causes divergence (check the decision boundary).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How approaches for weight initialization have shifted?<\/h3>\n\n\n\n<p>In 2012, AlexNet, the winner of that year\u2019s ImageNet Large Scale Visual Recognition Challenge (ILVSRC), popularized the weight initialization approach of \u201cinitialization with Gaussian (normal) noise with mean equal to zero and standard deviation set to 0.01 with bias equal to one for some layers\u201d (see<a href=\"https:\/\/papers.nips.cc\/paper\/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf\" target=\"_blank\" rel=\"noreferrer noopener\">\u00a0Krizhevsky et al. 2012<\/a>).<\/p>\n\n\n\n<p>However, this normal random initialization approach does not work for training very deep networks, especially those that use the ReLU (rectified linear unit) activation function, because of the vanishing and exploding gradient problem referenced earlier.<\/p>\n\n\n\n<p>To address these issues, Xavier and Bengio (2010) proposed the \u201cXavier\u201d initialization which considers the size of the network (number of input and output units) while initializing weights. This approach ensures that the weights stay within a reasonable range of values by making them inversely proportional to the square root of the number of units in the previous layer (referred to as\u00a0<em>fan-in<\/em>). See the diagram below on how to find the fan-in and fan-out for a given unit:<\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" class=\"wp-image-1021\" src=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2022\/06\/fan-in-1-1024x585-1.jpg\" alt=\"\" \/><\/figure>\n<\/div>\n\n\n\n<p>The choice of activation function ends up playing an important role in determining how effective the initialization method is. Activation functions are differentiable and introduce non-linear properties (i.e. curvature) into our neural networks that are crucial for solving the complex tasks that machine learning and deep learning are designed to tackle.<\/p>\n\n\n\n<p>The activation function is the non linear transformation that we do over the input signal. This transformed output is then sent to the next layer of units as input. Some examples of these non-linear activation functions are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Sigmoid<\/li>\n<li>Softmax<\/li>\n<li>Tanh<\/li>\n<li>ReLU<\/li>\n<li>Leaky ReLU<\/li>\n<\/ul>\n\n\n\n<p>Rectified Linear unit (ReLU) (and leaky ReLU) are commonly used since they are relatively robust to the vanishing\/exploding gradient issues. For activation functions like ReLU, Kaiming He et al. (2015) introduced a more robust weight initialization method that accounts for the fact that it\u2019s not symmetric (see performance differenced cited in the He et al. paper below). Both methods use a similar theoretical analysis: they find a good variance for the distribution from which the initial parameters are drawn. This variance is adapted to the activation function used and is derived without explicitly considering the type of the distribution.<\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" class=\"wp-image-1022\" src=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2022\/06\/epoch-error.jpg\" alt=\"\" \/><\/figure>\n<\/div>\n\n\n\n<p>Figure from<a href=\"https:\/\/arxiv.org\/abs\/1502.01852\" target=\"_blank\" rel=\"noreferrer noopener\">\u00a0the He et al. (2015) paper<\/a>\u00a0showing how their refined initialization strategy (red) reduces the error rate much faster than the Xavier method (blue) for (P)ReLUs and accounts for the fact that it is not symmetric.<\/p>\n\n\n\n<p>For an accessible proof of the Xavier and He initialization methods, see Pierre Ouannes\u2019 excellent post<a href=\"https:\/\/pouannes.github.io\/blog\/initialization\/\" target=\"_blank\" rel=\"noreferrer noopener\">\u00a0\u2018How to initialize deep neural networks? Xavier and Kaiming initialization\u2019<\/a>.<\/p>\n\n\n\n<p>It\u2019s important to note that weight initialization is\u00a0<em>still an active area of research.\u00a0<\/em>Several interesting research projects have popped up including<a href=\"https:\/\/arxiv.org\/abs\/1511.06856\" target=\"_blank\" rel=\"noreferrer noopener\">\u00a0data-dependent initializations<\/a>,<a href=\"https:\/\/openai.com\/blog\/block-sparse-gpu-kernels\/\" target=\"_blank\" rel=\"noreferrer noopener\">\u00a0sparse weight matrices<\/a>, and<a href=\"https:\/\/arxiv.org\/abs\/1312.6120\" target=\"_blank\" rel=\"noreferrer noopener\">\u00a0random orthogonal matrix initializations<\/a>.<\/p>\n\n\n\n<p>One of the most interesting developments in this area is MIT\u2019s<a href=\"https:\/\/towardsdatascience.com\/how-the-lottery-ticket-hypothesis-is-challenging-everything-we-knew-about-training-neural-networks-e56da4b0da27\" target=\"_blank\" rel=\"noreferrer noopener\">\u00a0Lottery Ticket Hypothesis<\/a>, which details how these large neural nets contain smaller \u201csubnetworks\u201d that are up to 10 times smaller than the full network. According to the research team, these subnetworks can learn just as well, making equally precise predictions sometimes faster than the full neural networks.<\/p>\n\n\n\n<p>The authors of \u2018<a href=\"https:\/\/internetpolicy.mit.edu\/publications\/#lottery\" target=\"_blank\" rel=\"noreferrer noopener\">The Lottery Ticket Hypothesis: Finding Sparse, Trainable Neural Networks<\/a>\u2019, Carbin and Frankle, tested their lottery ticket hypothesis and the existence of subnetworks by performing a process called\u00a0<em>pruning<\/em>, which involves eliminating unneeded connections from trained networks based on their network prioritization or weight to fit them on low-power devices.<\/p>\n\n\n\n<p>In fact,<a href=\"https:\/\/medium.com\/u\/b1d410cb9700\" target=\"_blank\" rel=\"noreferrer noopener\">\u00a0TensorFlow<\/a>\u00a0recently announced a new weight pruning API:<\/p>\n\n\n\n<p>Weight pruning means eliminating unnecessary values in the weight tensors. We are practically setting the neural network parameters\u2019 values to zero to remove what we estimate are unnecessary connections between the layers of a neural network. This is done during the training process to allow the neural network to adapt to the changes.<\/p>\n\n\n\n<p>Read more about the weight pruning API<a href=\"https:\/\/medium.com\/tensorflow\/tensorflow-model-optimization-toolkit-pruning-api-42cac9157a6a\" target=\"_blank\" rel=\"noreferrer noopener\">\u00a0here<\/a>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Interactive Demo<\/strong><\/h4>\n\n\n\n<p>Try out this interactive demo\u00a0<a href=\"https:\/\/www.deeplearning.ai\/ai-notes\/initialization\/\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>.\u00a0<strong>The size of the weight values matter but making sure that the weights are randomly initialized is also critical<\/strong>. This random initialization approach is based off of a known property called\u00a0<strong>Break Symmetry\u00a0<\/strong>where:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>If two hidden units have the same inputs and same activation function, then they must have different initial parameters<\/li>\n<li>It\u2019s desirable to initialize each unit to compute a different function<\/li>\n<\/ul>\n\n\n\n<p>If the weights are initialized with just zeros, every neuron in the network would compute the same output, and gradients would undergo the exact same parameter updates. In other words, the units in the neural network will learn the same features during training if their weights are initialized to be the same value.<\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" class=\"wp-image-1023\" src=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2022\/06\/meme.jpg\" alt=\"\" \/><\/figure>\n<\/div>\n\n\n\n<p><em>With transfer learning, instead of starting from randomly initialized weights, you use weights saved from a previous network as the initial weights for your new experiment (i.e. fine-tuning a pre-trained network).<\/em><\/p>\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n<h2 class=\"wp-block-heading\"><em>Want to stay in the loop?\u00a0<a href=\"https:\/\/info.comet.ml\/newsletter-signup\/?utm_campaign=tensorboard-integration&amp;utm_source=blog&amp;utm_medium=CTA\">Subscribe to the Comet Newsletter<\/a>\u00a0for weekly insights and perspective on the latest ML news, projects, and more.<\/em><\/h2>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; Part 1 of a two part series The weight initialization technique you choose for your neural network can determine how quickly the network converges or whether it converges at all. Although the initial values of these weights are just one parameter among many to tune, they are incredibly important. Their distribution affects the gradients [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1906,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"customer_name":"","customer_description":"","customer_industry":"","customer_technologies":"","customer_logo":"","footnotes":""},"categories":[6],"tags":[],"coauthors":[107],"class_list":["post-1902","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-machine-learning"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Selecting the right weight initialization for your deep neural network - Comet<\/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:\/\/www.comet.com\/site\/blog\/selecting-the-right-weight-initialization-for-your-deep-neural-network\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Selecting the right weight initialization for your deep neural network\" \/>\n<meta property=\"og:description\" content=\"&nbsp; Part 1 of a two part series The weight initialization technique you choose for your neural network can determine how quickly the network converges or whether it converges at all. Although the initial values of these weights are just one parameter among many to tune, they are incredibly important. Their distribution affects the gradients [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.comet.com\/site\/blog\/selecting-the-right-weight-initialization-for-your-deep-neural-network\/\" \/>\n<meta property=\"og:site_name\" content=\"Comet\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/cometdotml\" \/>\n<meta property=\"article:published_time\" content=\"2019-08-20T23:31:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2022\/06\/fan-in.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1455\" \/>\n\t<meta property=\"og:image:height\" content=\"831\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Gideon Mendels\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@Cometml\" \/>\n<meta name=\"twitter:site\" content=\"@Cometml\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Gideon Mendels\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Selecting the right weight initialization for your deep neural network - Comet","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:\/\/www.comet.com\/site\/blog\/selecting-the-right-weight-initialization-for-your-deep-neural-network\/","og_locale":"en_US","og_type":"article","og_title":"Selecting the right weight initialization for your deep neural network","og_description":"&nbsp; Part 1 of a two part series The weight initialization technique you choose for your neural network can determine how quickly the network converges or whether it converges at all. Although the initial values of these weights are just one parameter among many to tune, they are incredibly important. Their distribution affects the gradients [&hellip;]","og_url":"https:\/\/www.comet.com\/site\/blog\/selecting-the-right-weight-initialization-for-your-deep-neural-network\/","og_site_name":"Comet","article_publisher":"https:\/\/www.facebook.com\/cometdotml","article_published_time":"2019-08-20T23:31:33+00:00","og_image":[{"width":1455,"height":831,"url":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2022\/06\/fan-in.jpg","type":"image\/jpeg"}],"author":"Gideon Mendels","twitter_card":"summary_large_image","twitter_creator":"@Cometml","twitter_site":"@Cometml","twitter_misc":{"Written by":"Gideon Mendels","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.comet.com\/site\/blog\/selecting-the-right-weight-initialization-for-your-deep-neural-network\/#article","isPartOf":{"@id":"https:\/\/www.comet.com\/site\/blog\/selecting-the-right-weight-initialization-for-your-deep-neural-network\/"},"author":{"name":"engineering@atre.net","@id":"https:\/\/www.comet.com\/site\/#\/schema\/person\/550ac35e8e821db8064c5bd1f0a04e6b"},"headline":"Selecting the right weight initialization for your deep neural network","datePublished":"2019-08-20T23:31:33+00:00","mainEntityOfPage":{"@id":"https:\/\/www.comet.com\/site\/blog\/selecting-the-right-weight-initialization-for-your-deep-neural-network\/"},"wordCount":1166,"publisher":{"@id":"https:\/\/www.comet.com\/site\/#organization"},"image":{"@id":"https:\/\/www.comet.com\/site\/blog\/selecting-the-right-weight-initialization-for-your-deep-neural-network\/#primaryimage"},"thumbnailUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2022\/06\/fan-in.jpg","articleSection":["Machine Learning"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.comet.com\/site\/blog\/selecting-the-right-weight-initialization-for-your-deep-neural-network\/","url":"https:\/\/www.comet.com\/site\/blog\/selecting-the-right-weight-initialization-for-your-deep-neural-network\/","name":"Selecting the right weight initialization for your deep neural network - Comet","isPartOf":{"@id":"https:\/\/www.comet.com\/site\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.comet.com\/site\/blog\/selecting-the-right-weight-initialization-for-your-deep-neural-network\/#primaryimage"},"image":{"@id":"https:\/\/www.comet.com\/site\/blog\/selecting-the-right-weight-initialization-for-your-deep-neural-network\/#primaryimage"},"thumbnailUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2022\/06\/fan-in.jpg","datePublished":"2019-08-20T23:31:33+00:00","breadcrumb":{"@id":"https:\/\/www.comet.com\/site\/blog\/selecting-the-right-weight-initialization-for-your-deep-neural-network\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.comet.com\/site\/blog\/selecting-the-right-weight-initialization-for-your-deep-neural-network\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.comet.com\/site\/blog\/selecting-the-right-weight-initialization-for-your-deep-neural-network\/#primaryimage","url":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2022\/06\/fan-in.jpg","contentUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2022\/06\/fan-in.jpg","width":1455,"height":831,"caption":"Right Weight Initialization for Deep Neural Network"},{"@type":"BreadcrumbList","@id":"https:\/\/www.comet.com\/site\/blog\/selecting-the-right-weight-initialization-for-your-deep-neural-network\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.comet.com\/site\/"},{"@type":"ListItem","position":2,"name":"Selecting the right weight initialization for your deep neural network"}]},{"@type":"WebSite","@id":"https:\/\/www.comet.com\/site\/#website","url":"https:\/\/www.comet.com\/site\/","name":"Comet","description":"Build Better Models Faster","publisher":{"@id":"https:\/\/www.comet.com\/site\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.comet.com\/site\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.comet.com\/site\/#organization","name":"Comet ML, Inc.","alternateName":"Comet","url":"https:\/\/www.comet.com\/site\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.comet.com\/site\/#\/schema\/logo\/image\/","url":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/01\/logo_comet_square.png","contentUrl":"https:\/\/www.comet.com\/site\/wp-content\/uploads\/2025\/01\/logo_comet_square.png","width":310,"height":310,"caption":"Comet ML, Inc."},"image":{"@id":"https:\/\/www.comet.com\/site\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/cometdotml","https:\/\/x.com\/Cometml","https:\/\/www.youtube.com\/channel\/UCmN63HKvfXSCS-UwVwmK8Hw"]},{"@type":"Person","@id":"https:\/\/www.comet.com\/site\/#\/schema\/person\/550ac35e8e821db8064c5bd1f0a04e6b","name":"engineering@atre.net","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.comet.com\/site\/#\/schema\/person\/image\/027c18177377edf459980f0cfb83706c","url":"https:\/\/secure.gravatar.com\/avatar\/d002a459a297e0d1779329318029aee19868c312b3e1f3c9ec9b3e3add2740de?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d002a459a297e0d1779329318029aee19868c312b3e1f3c9ec9b3e3add2740de?s=96&d=mm&r=g","caption":"engineering@atre.net"},"sameAs":["https:\/\/live-cometml.pantheonsite.io"],"url":"https:\/\/www.comet.com\/site\/blog\/author\/engineeringatre-net\/"}]}},"_links":{"self":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts\/1902","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/comments?post=1902"}],"version-history":[{"count":0,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/posts\/1902\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/media\/1906"}],"wp:attachment":[{"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/media?parent=1902"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/categories?post=1902"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/tags?post=1902"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.comet.com\/site\/wp-json\/wp\/v2\/coauthors?post=1902"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}