[{"data":1,"prerenderedAt":967},["ShallowReactive",2],{"lang-switch-post-\u002Fplaylists\u002Fneural-networks\u002Fsigmoide-consertada-hinge-perdeu-margem":3,"post-pt-neural-networks-sigmoide-consertada-hinge-perdeu-margem":4},"\u002Fen\u002Fplaylists\u002Fneural-networks\u002Fsigmoide-consertada-hinge-perdeu-margem",{"id":5,"title":6,"body":7,"cover":951,"date":952,"description":953,"extension":954,"meta":955,"navigation":956,"order":191,"path":957,"playlist":958,"seo":959,"status":960,"stem":961,"tags":962,"__hash__":966},"posts\u002Fpt\u002Fplaylists\u002Fneural-networks\u002Fsigmoide-consertada-hinge-perdeu-margem.md","A Sigmoide Foi Consertada, a Hinge Perdeu a Margem",{"type":8,"value":9,"toc":940},"minimark",[10,25,30,83,118,139,150,201,247,259,267,295,302,322,357,373,377,419,422,456,525,536,546,656,674,678,684,696,707,711,762,766,772,792,834,844,858,898,905,922,933,936],[11,12,13,14,19,20,24],"p",{},"Aula 4a, e ela pega exatamente onde ",[15,16,18],"a",{"href":17},"\u002Fplaylists\u002Fneural-networks\u002Ffuncoes-de-custo","o post passado"," parou. Mesmo dataset, mesmo framework de ",[21,22,23],"code",{},"CostFunction"," plugável, mas o professor voltou nas implementações e mexeu em duas delas. Vale conferir linha por linha o que mudou, porque uma mudança conserta um bug de verdade, e a outra, sem querer, cria um novo.",[26,27,29],"h2",{"id":28},"o-scaffolding-não-mudou-só-um-detalhe-cosmético","O scaffolding não mudou, só um detalhe cosmético",[31,32,37],"pre",{"className":33,"code":34,"language":35,"meta":36,"style":36},"language-python shiki shiki-themes github-light github-dark","def createDataset(n=20):\n  X = np.random.rand(n,2)\n  coefs = np.array([1, 1])\n  intercept = 1\n  labels = X @ coefs - intercept\n  y = np.sign(labels)\n  return X, y\n","python","",[21,38,39,47,53,59,65,71,77],{"__ignoreMap":36},[40,41,44],"span",{"class":42,"line":43},"line",1,[40,45,46],{},"def createDataset(n=20):\n",[40,48,50],{"class":42,"line":49},2,[40,51,52],{},"  X = np.random.rand(n,2)\n",[40,54,56],{"class":42,"line":55},3,[40,57,58],{},"  coefs = np.array([1, 1])\n",[40,60,62],{"class":42,"line":61},4,[40,63,64],{},"  intercept = 1\n",[40,66,68],{"class":42,"line":67},5,[40,69,70],{},"  labels = X @ coefs - intercept\n",[40,72,74],{"class":42,"line":73},6,[40,75,76],{},"  y = np.sign(labels)\n",[40,78,80],{"class":42,"line":79},7,[40,81,82],{},"  return X, y\n",[11,84,85,86,89,90,93,94,97,98,101,102,105,106,109,110,113,114,117],{},"Única diferença real do dataset ",[15,87,88],{"href":17},"do post passado",": ",[21,91,92],{},"y = np.sign(labels)"," no lugar de ",[21,95,96],{},"np.array(labels>0, dtype=int)*2-1",". Duas contas diferentes, mesmíssimo resultado (",[21,99,100],{},"-1"," ou ",[21,103,104],{},"+1","), só um jeito mais direto de escrever a mesma coisa. ",[21,107,108],{},"TrainingAlgorithm",", ",[21,111,112],{},"SGD"," e ",[21,115,116],{},"WidrowHoff"," vieram colados, sem mudar uma vírgula, então não replico de novo aqui.",[119,120,121],"blockquote",{},[11,122,123,130,131,134,135,138],{},[124,125,126,127,129],"strong",{},"Saída (",[21,128,116],{},"):"," acurácia ",[21,132,133],{},"1.0",", pesos ",[21,136,137],{},"[-1.98, 1.20, 2.36]",".",[26,140,142,145,146,149],{"id":141},"smoothedsurrogate-mesma-essência-get_cost-ainda-mais-decorativo",[21,143,144],{},"SmoothedSurrogate",": mesma essência, ",[21,147,148],{},"get_cost"," ainda mais decorativo",[31,151,153],{"className":33,"code":152,"language":35,"meta":36,"style":36},"class SmoothedSurrogate(CostFunction):\n  @staticmethod\n  def get_cost(y, y_pred):\n    y_pred = (y_pred >= 0).astype(int)\n    return np.sum(np.maximum(np.zeros(y.shape), -y * y_pred))\n  @staticmethod\n  def get_gradient(X, y, y_pred):\n    y_pred = np.sign(y_pred)\n    return X.T @ (y - y_pred)\n",[21,154,155,160,165,170,175,180,184,189,195],{"__ignoreMap":36},[40,156,157],{"class":42,"line":43},[40,158,159],{},"class SmoothedSurrogate(CostFunction):\n",[40,161,162],{"class":42,"line":49},[40,163,164],{},"  @staticmethod\n",[40,166,167],{"class":42,"line":55},[40,168,169],{},"  def get_cost(y, y_pred):\n",[40,171,172],{"class":42,"line":61},[40,173,174],{},"    y_pred = (y_pred >= 0).astype(int)\n",[40,176,177],{"class":42,"line":67},[40,178,179],{},"    return np.sum(np.maximum(np.zeros(y.shape), -y * y_pred))\n",[40,181,182],{"class":42,"line":73},[40,183,164],{},[40,185,186],{"class":42,"line":79},[40,187,188],{},"  def get_gradient(X, y, y_pred):\n",[40,190,192],{"class":42,"line":191},8,[40,193,194],{},"    y_pred = np.sign(y_pred)\n",[40,196,198],{"class":42,"line":197},9,[40,199,200],{},"    return X.T @ (y - y_pred)\n",[11,202,203,206,207,210,211,214,215,217,218,221,222,225,226,229,230,225,232,234,235,109,238,240,241,243,244,246],{},[21,204,205],{},"get_gradient"," continua idêntico em espírito ao ",[15,208,209],{"href":17},"critério do perceptron que já vi",": mede erro depois do ",[21,212,213],{},"sign()",". O ",[21,216,148],{}," mudou (",[21,219,220],{},"y_pred >= 0"," vira ",[21,223,224],{},"0","\u002F",[21,227,228],{},"1",", não mais ",[21,231,100],{},[21,233,104],{},"), mas ",[15,236,237],{"href":17},"como já vi antes",[21,239,148],{}," nunca entra no treino, só ",[21,242,205],{}," é chamado pelo ",[21,245,112],{},". Fica ainda mais torto que antes, mas continua sem importar pra nada.",[119,248,249],{},[11,250,251,130,254,134,256,138],{},[124,252,253],{},"Saída:",[21,255,133],{},[21,257,258],{},"[-0.51, 0.56, 0.47]",[26,260,262,263,266],{"id":261},"o-conserto-de-verdade-expit-finalmente-bate-com-o-rótulo","O conserto de verdade: ",[21,264,265],{},"expit"," finalmente bate com o rótulo",[31,268,270],{"className":33,"code":269,"language":35,"meta":36,"style":36},"class LogLikehood(CostFunction):\n  @staticmethod\n  def get_gradient(X, y, y_pred):\n    y = (y>0).astype(int)\n    return X.T @ (y - expit(y_pred))\n",[21,271,272,277,281,285,290],{"__ignoreMap":36},[40,273,274],{"class":42,"line":43},[40,275,276],{},"class LogLikehood(CostFunction):\n",[40,278,279],{"class":42,"line":49},[40,280,164],{},[40,282,283],{"class":42,"line":55},[40,284,188],{},[40,286,287],{"class":42,"line":61},[40,288,289],{},"    y = (y>0).astype(int)\n",[40,291,292],{"class":42,"line":67},[40,293,294],{},"    return X.T @ (y - expit(y_pred))\n",[11,296,297,298,301],{},"Compara com ",[15,299,300],{"href":17},"a versão quebrada que eu investiguei na aula passada",":",[31,303,305],{"className":33,"code":304,"language":35,"meta":36,"style":36},"# aula03b, o bug original\ndef get_gradient(X, y, y_pred):\n  return X.T @ (y - expit(y_pred))\n",[21,306,307,312,317],{"__ignoreMap":36},[40,308,309],{"class":42,"line":43},[40,310,311],{},"# aula03b, o bug original\n",[40,313,314],{"class":42,"line":49},[40,315,316],{},"def get_gradient(X, y, y_pred):\n",[40,318,319],{"class":42,"line":55},[40,320,321],{},"  return X.T @ (y - expit(y_pred))\n",[11,323,324,325,328,329,225,331,333,334,225,336,338,339,342,343,346,347,350,351,353,354,356],{},"A diferença é uma linha só: ",[21,326,327],{},"y = (y>0).astype(int)",". Isso converte o rótulo de ",[21,330,100],{},[21,332,104],{}," pra ",[21,335,224],{},[21,337,228],{}," ",[124,340,341],{},"antes"," de subtrair de ",[21,344,345],{},"expit(y_pred)",", que só devolve valores em ",[21,348,349],{},"(0,1)",". É exatamente o conserto que eu previ no post passado: alinhar a faixa do rótulo com a faixa da sigmoide, em vez de comparar ",[21,352,100],{}," (impossível pra ",[21,355,265],{}," alcançar) contra um número que nunca fica negativo.",[119,358,359],{},[11,360,361,130,363,134,365,368,369,372],{},[124,362,253],{},[124,364,133],{},[21,366,367],{},"[-5.44, 3.33, 5.82]",". Comparado com o ",[21,370,371],{},"0.65"," que eu tinha achado antes, a diferença fala por si.",[26,374,376],{"id":375},"a-hinge-loss-consertada-que-na-real-virou-outra-coisa","A hinge loss \"consertada\" que, na real, virou outra coisa",[31,378,380],{"className":33,"code":379,"language":35,"meta":36,"style":36},"class HingeLoss(CostFunction):\n  @staticmethod\n  def get_gradient(X, y, y_pred):\n    y_pred = np.sign(y_pred)\n    marginal_errors = (y * y_pred) \u003C 1\n    marginal_ys = np.copy(y)\n    marginal_ys[~marginal_errors] = 0\n    return X.T @ marginal_ys\n",[21,381,382,387,391,395,399,404,409,414],{"__ignoreMap":36},[40,383,384],{"class":42,"line":43},[40,385,386],{},"class HingeLoss(CostFunction):\n",[40,388,389],{"class":42,"line":49},[40,390,164],{},[40,392,393],{"class":42,"line":55},[40,394,188],{},[40,396,397],{"class":42,"line":61},[40,398,194],{},[40,400,401],{"class":42,"line":67},[40,402,403],{},"    marginal_errors = (y * y_pred) \u003C 1\n",[40,405,406],{"class":42,"line":73},[40,407,408],{},"    marginal_ys = np.copy(y)\n",[40,410,411],{"class":42,"line":79},[40,412,413],{},"    marginal_ys[~marginal_errors] = 0\n",[40,415,416],{"class":42,"line":191},[40,417,418],{},"    return X.T @ marginal_ys\n",[11,420,421],{},"De novo, compara com a versão de antes:",[31,423,425],{"className":33,"code":424,"language":35,"meta":36,"style":36},"# aula03b\ndef get_gradient(X, y, y_pred):\n  marginal_errors = (y * y_pred) \u003C 1\n  marginal_ys = np.copy(y)\n  marginal_ys[~marginal_errors] = 0\n  return X.T @ marginal_ys\n",[21,426,427,432,436,441,446,451],{"__ignoreMap":36},[40,428,429],{"class":42,"line":43},[40,430,431],{},"# aula03b\n",[40,433,434],{"class":42,"line":49},[40,435,316],{},[40,437,438],{"class":42,"line":55},[40,439,440],{},"  marginal_errors = (y * y_pred) \u003C 1\n",[40,442,443],{"class":42,"line":61},[40,444,445],{},"  marginal_ys = np.copy(y)\n",[40,447,448],{"class":42,"line":67},[40,449,450],{},"  marginal_ys[~marginal_errors] = 0\n",[40,452,453],{"class":42,"line":73},[40,454,455],{},"  return X.T @ marginal_ys\n",[11,457,458,459,462,463,470,471,474,475,478,479,109,482,485,486,489,490,493,494,497,498,501,502,505,506,109,508,510,511,513,514,516,517,520,521,524],{},"A única mudança é a linha ",[21,460,461],{},"y_pred = np.sign(y_pred)",", adicionada bem no início. Parece inofensiva, ",[15,464,466,467,469],{"href":465},"\u002Fplaylists\u002Fneural-networks\u002Fmcculloch-pitts-perceptron","o mesmo ",[21,468,213],{}," que já apareceu em toda essa playlist",", mas ela muda o significado inteiro de ",[21,472,473],{},"marginal_errors",". Antes, ",[21,476,477],{},"y * y_pred"," usava a pré-ativação ",[124,480,481],{},"contínua",[21,483,484],{},"y * ŷ \u003C 1"," incluía tanto ponto errado (",[21,487,488],{},"y * ŷ \u003C 0",") quanto ponto certo mas ",[124,491,492],{},"sem folga"," (",[21,495,496],{},"0 ≤ y * ŷ \u003C 1","), esses últimos são os \"vetores de suporte\" que ",[15,499,500],{"href":17},"eu expliquei no post passado",": a hinge loss segue empurrando a fronteira até eles terem folga de sobra. Agora, com ",[21,503,504],{},"y_pred"," já passado por ",[21,507,213],{},[21,509,477],{}," só pode valer ",[21,512,100],{}," (errado) ou ",[21,515,104],{}," (certo), nunca um valor intermediário. ",[21,518,519],{},"\u003C 1"," vira sinônimo de \"só errado\", exatamente ",[15,522,523],{"href":17},"o critério do perceptron"," de novo, só que escrito com mais linhas.",[119,526,527],{},[11,528,529,130,531,134,533,138],{},[124,530,253],{},[21,532,133],{},[21,534,535],{},"[-0.58, 0.53, 0.59]",[11,537,538,539,542,543,545],{},"Pra confirmar que não é implicância minha com uma linha de código, montei um exemplo concreto: peguei uma fronteira já treinada (",[21,540,541],{},"w = [-2.5, 3.0, 2.75]",", que separa os 20 pontos com acurácia ",[21,544,133],{},") e conferi, ponto a ponto, quem cada regra considera \"marginal\" (ou seja, quem ainda pesa no gradiente).",[547,548,549,582],"table",{},[550,551,552],"thead",{},[553,554,555,560,566,569,576,579],"tr",{},[556,557,559],"th",{"align":558},"center","Ponto",[556,561,563],{"align":562},"left",[21,564,565],{},"x0, x1",[556,567,568],{"align":558},"classe",[556,570,572,575],{"align":571},"right",[21,573,574],{},"y·ŷ"," (margem contínua)",[556,577,578],{"align":558},"Regra antiga (aula03b)",[556,580,581],{"align":558},"Regra nova (aula04a)",[583,584,585,611,633],"tbody",{},[553,586,587,591,596,600,605,608],{},[588,589,590],"td",{"align":558},"6",[588,592,593],{"align":562},[21,594,595],{},"(0.091, 0.810)",[588,597,598],{"align":558},[21,599,100],{},[588,601,602],{"align":571},[21,603,604],{},"0.001",[588,606,607],{"align":558},"marginal (ajusta)",[588,609,610],{"align":558},"ignorado",[553,612,613,615,620,624,629,631],{},[588,614,224],{"align":558},[588,616,617],{"align":562},[21,618,619],{},"(0.452, 0.560)",[588,621,622],{"align":558},[21,623,104],{},[588,625,626],{"align":571},[21,627,628],{},"0.397",[588,630,607],{"align":558},[588,632,610],{"align":558},[553,634,635,638,643,647,652,654],{},[588,636,637],{"align":558},"8",[588,639,640],{"align":562},[21,641,642],{},"(0.982, 0.965)",[588,644,645],{"align":558},[21,646,104],{},[588,648,649],{"align":571},[21,650,651],{},"3.100",[588,653,610],{"align":558},[588,655,610],{"align":558},[11,657,658,659,662,663,665,666,669,670,673],{},"O ponto 6 é o mais revelador: sua pré-ativação é ",[21,660,661],{},"-0.001",", praticamente em cima da fronteira, o tipo de ponto que devia continuar \"incomodando\" o treino. A regra antiga (margem contínua) reconhece isso e segue ajustando o peso nele. A regra nova, como já aplicou ",[21,664,213],{},", só vê que ele caiu (por muito pouco) do lado certo, e desiste de mexer nele. No total, ",[124,667,668],{},"9 dos 20 pontos"," caem nessa faixa (",[21,671,672],{},"0 ≤ y·ŷ \u003C 1",", corretos mas sem folga): a regra antiga continua ajustando o peso neles, a regra nova considera todos os 9 já resolvidos.",[26,675,677],{"id":676},"as-quatro-fronteiras-dessa-aula-lado-a-lado","As quatro fronteiras dessa aula, lado a lado",[11,679,680,681,683],{},"Mesmo exercício visual ",[15,682,88],{"href":17},", agora com os pesos reais que essa versão consertada encontrou:",[685,686],"classification-boundary-comparison-chart",{":boundaries":687,":classes":688,":points":689,":x-max":690,":x-min":691,":y-max":690,":y-min":691,"negative-label":692,"positive-label":693,"x-label":694,"y-label":695},"[{\"w\":[1.20352648,2.36049089],\"bias\":-1.98404527,\"label\":\"Widrow-Hoff\"},{\"w\":[0.56431986,0.4707198],\"bias\":-0.50817736,\"label\":\"Perceptron\"},{\"w\":[3.32853637,5.8209982],\"bias\":-5.44082457,\"label\":\"Log-verossimilhança (consertada)\"},{\"w\":[0.52695741,0.59010705],\"bias\":-0.57855574,\"label\":\"Hinge (aula04a)\"}]","[-1, 1, 1, 1, -1, 1, 1, -1, 1, -1, 1, -1, 1, -1, -1, 1, -1, -1, -1, -1]","[[0.206, 0.397], [0.815, 0.237], [0.763, 0.289], [0.375, 0.993], [0.514, 0.237], [0.62, 0.801], [0.942, 0.064], [0.61, 0.389], [0.234, 0.784], [0.527, 0.045], [0.945, 0.578], [0.366, 0.132], [0.906, 0.267], [0.192, 0.677], [0.137, 0.292], [0.789, 0.264], [0.017, 0.517], [0.663, 0.146], [0.617, 0.129], [0.01, 0.342]]","1.1","-0.1","classe -1","classe +1","x0","x1",[11,697,698,699,702,703,706],{},"De novo as quatro convergem pra praticamente a mesma reta, nesse dataset fácil. A diferença que a análise de cima revelou não está em ",[124,700,701],{},"onde"," a fronteira final fica, está em ",[124,704,705],{},"quais pontos continuam sendo ajustados"," ao longo do treino, algo que esse gráfico (só o resultado final) não tem como mostrar sozinho.",[26,708,710],{"id":709},"fechando","Fechando",[547,712,713,723],{},[550,714,715],{},[553,716,717,720],{},[556,718,719],{"align":562},"O que eu já sabia",[556,721,722],{"align":562},"O que essa aula assentou",[583,724,725,743,754],{},[553,726,727,736],{},[588,728,729,730,732,733],{"align":562},"Achei o bug do ",[21,731,265],{}," contra rótulo ",[21,734,735],{},"±1",[588,737,738,739,742],{"align":562},"O professor confirmou o diagnóstico: converter o rótulo pra ",[21,740,741],{},"{0,1}"," resolve, exatamente como eu previ",[553,744,745,748],{},[588,746,747],{"align":562},"Hinge loss usa margem contínua pra decidir quem é \"vetor de suporte\"",[588,749,750,751,753],{"align":562},"Aplicar ",[21,752,213],{}," antes de medir a margem colapsa isso em \"certo ou errado\", perdendo a noção de margem por completo",[553,755,756,759],{},[588,757,758],{"align":562},"Um conserto de bug pode, sem querer, introduzir outro",[588,760,761],{"align":562},"Vale conferir cada correção linha por linha, mesmo quando o resultado final (acurácia) parece bom",[26,763,765],{"id":764},"aplicação-prática","Aplicação Prática",[11,767,768,769,771],{},"Repeti a comparação hinge real (margem contínua) vs. hinge da aula04a (margem via ",[21,770,213],{},") em dois datasets reais já usados nessa playlist.",[11,773,774,775,779,780,109,783,787,788,791],{},"No Iris (",[776,777,778],"em",{},"setosa"," vs. ",[776,781,782],{},"versicolor",[15,784,786],{"href":785},"\u002Fplaylists\u002Fneural-networks\u002Fperceptron-com-bias","de novo","), rodei as duas variantes com o mesmo ",[21,789,790],{},"learning_rate=0.01"," e a mesma semente:",[547,793,794,807],{},[550,795,796],{},[553,797,798,801,804],{},[556,799,800],{"align":562},"Versão",[556,802,803],{"align":571},"Acurácia treino",[556,805,806],{"align":571},"Acurácia teste",[583,808,809,820],{},[553,810,811,814,816],{},[588,812,813],{"align":562},"Hinge real (margem contínua)",[588,815,133],{"align":571},[588,817,818],{"align":571},[124,819,133],{},[553,821,822,828,830],{},[588,823,824,825,827],{"align":562},"Hinge aula04a (margem via ",[21,826,213],{},")",[588,829,133],{"align":571},[588,831,832],{"align":571},[124,833,133],{},[11,835,836,837,840,841,843],{},"Empate técnico, e faz sentido: ",[15,838,839],{"href":785},"o Iris tem margem generosa demais"," pra sobrar algum ponto na faixa ",[21,842,672],{}," depois de convergir, então as duas regras acabam concordando sobre quem é \"marginal\": ninguém.",[11,845,846,847,109,854,857],{},"Troquei pro dataset de duas luas (",[15,848,850,853],{"href":849},"\u002Fplaylists\u002Fneural-networks\u002Fxor-o-limite-do-perceptron",[21,851,852],{},"make_moons",", já usado no post do XOR",[21,855,856],{},"noise=0.25"," dessa vez pra garantir sobreposição real entre as classes, sem separação linear perfeita) e rodei 20 sementes diferentes pra cada versão:",[547,859,860,872],{},[550,861,862],{},[553,863,864,866,869],{},[556,865,800],{"align":562},[556,867,868],{"align":571},"Acurácia teste (média de 20 sementes)",[556,870,871],{"align":571},"Norma do vetor de peso (média)",[583,873,874,886],{},[553,875,876,878,883],{},[588,877,813],{"align":562},[588,879,880],{"align":571},[124,881,882],{},"0.878",[588,884,885],{"align":571},"2.90",[553,887,888,892,895],{},[588,889,824,890,827],{"align":562},[21,891,213],{},[588,893,894],{"align":571},"0.842",[588,896,897],{"align":571},"0.67",[11,899,900,901,904],{},"Com dado onde a fronteira linear não é perfeita, a diferença aparece: a hinge real bate a versão da aula04a em acurácia de teste nas 20 sementes, e a norma do peso é quase ",[124,902,903],{},"4 vezes maior",", exatamente porque ela continua ajustando a fronteira nos pontos que caem certos mas sem folga, empurrando pra uma separação mais confiante, em vez de parar assim que o sinal já bate. É a demonstração prática de que a margem contínua não é só detalhe teórico, ela muda o resultado quando o dataset não é trivialmente separável.",[11,906,907,908,910,911,914,915,917,918,921],{},"Pegando uma semente específica dessas 20 (acurácia de teste ",[21,909,882],{}," na hinge real, ",[21,912,913],{},"0.789"," na versão ",[21,916,213],{},", bem perto da média das duas), plotando as duas fronteiras sobre os ",[124,919,920],{},"90 pontos de teste",", os mesmos já usados no post do ELM:",[685,923],{":boundaries":924,":classes":925,":points":926,":x-max":927,":x-min":928,":y-max":929,":y-min":930,"negative-label":931,"positive-label":932,"x-label":694,"y-label":695},"[{\"w\":[0.897,-2.763],\"bias\":0.18,\"label\":\"Hinge real (margem contínua)\"},{\"w\":[0.066,-0.627],\"bias\":-0.06,\"label\":\"Hinge aula04a (margem via sign())\"}]","[1, 1, 1, 1, 1, -1, 1, -1, 1, 1, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1, -1, 1, -1, -1, 1, 1, -1, 1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, 1, 1, 1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, 1, 1, -1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1]","[[0.459, -0.307], [2.533, 0.563], [0.775, -0.587], [0.313, 0.02], [1.919, -0.722], [-0.467, 0.153], [1.938, 0.643], [-0.059, 0.977], [1.001, -0.314], [1.285, -0.493], [-0.569, 0.954], [-0.516, 0.844], [0.062, 0.484], [0.626, 1.302], [1.613, 0.5], [1.921, 0.04], [-0.883, 0.769], [1.574, 0.382], [1.2, -0.04], [-1.196, 0.011], [0.07, 1.035], [1.268, -0.456], [0.976, 0.071], [-0.776, 0.618], [1.839, -0.179], [1.958, -0.004], [1.424, 0.352], [0.508, -0.064], [0.089, 1.376], [1.53, -0.02], [0.725, -0.242], [0.735, 0.453], [0.764, 0.067], [-1.03, 0.902], [0.265, 1.636], [0.992, -0.205], [-0.404, 0.661], [0.519, -0.287], [1.167, -0.596], [0.576, -0.121], [1.29, -0.046], [-0.235, 1.188], [-1.088, 0.061], [1.0, -0.268], [-0.046, 1.319], [0.093, 0.118], [0.234, -0.23], [0.364, -0.531], [1.369, -0.069], [1.319, -0.777], [0.356, -0.179], [0.542, -1.002], [1.024, -0.46], [1.414, 0.592], [-0.73, 0.946], [0.149, 0.648], [-0.741, -0.41], [0.029, 1.456], [1.178, -0.145], [0.529, 0.794], [2.187, 0.293], [0.955, 0.648], [0.321, -0.131], [1.787, 0.148], [0.508, 0.51], [1.277, 0.558], [1.535, -0.584], [0.924, 0.607], [-0.236, 0.773], [1.57, -0.272], [0.271, -0.032], [0.692, 0.917], [0.399, 0.695], [0.374, -0.947], [2.224, -0.191], [0.046, 0.335], [0.412, 0.782], [-0.265, 0.983], [0.897, 0.68], [0.494, 0.467], [0.625, 0.516], [2.185, 0.273], [0.382, 0.436], [-1.1, 0.543], [2.113, 0.488], [1.479, 0.104], [0.197, -0.404], [1.417, -0.792], [1.153, -0.648], [1.418, -0.025]]","2.6","-1.3","1.7","-1.1","lua 0","lua 1",[11,934,935],{},"Dá pra ver a diferença de \"confiança\" nas duas retas: a hinge real (peso maior) corta mais perpendicular à faixa de sobreposição entre as luas, arriscando mais pra separar melhor; a versão da aula04a, com peso pequeno, fica mais \"morna\", parando de ajustar assim que os pontos claramente corretos saem da conta, mesmo sem folga de sobra.",[937,938,939],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":36,"searchDepth":49,"depth":49,"links":941},[942,943,945,947,948,949,950],{"id":28,"depth":49,"text":29},{"id":141,"depth":49,"text":944},"SmoothedSurrogate: mesma essência, get_cost ainda mais decorativo",{"id":261,"depth":49,"text":946},"O conserto de verdade: expit finalmente bate com o rótulo",{"id":375,"depth":49,"text":376},{"id":676,"depth":49,"text":677},{"id":709,"depth":49,"text":710},{"id":764,"depth":49,"text":765},null,"2026-08-27","Aula 4a: o professor volta e conserta exatamente a incompatibilidade entre sigmoide e rótulo ±1 que eu achei na aula passada. Só que, conferindo linha por linha, a correção da hinge loss escondeu um problema novo: ela virou, sem querer, o critério do perceptron de novo.","md",{},true,"\u002Fpt\u002Fplaylists\u002Fneural-networks\u002Fsigmoide-consertada-hinge-perdeu-margem","neural-networks",{"title":6,"description":953},"published","pt\u002Fplaylists\u002Fneural-networks\u002Fsigmoide-consertada-hinge-perdeu-margem",[963,964,965],"funcoes-de-custo","hinge-loss","log-verossimilhanca","Pyw8bPff7jNGt9g0z9quF2t-Ue1Qqdt5xmmPqwNWH5Q",1788965098872]