Ders 07 / 16
Erişim Artırılmış Üretim Nedir
İki yüz belgelik kurgu bir dağarcıkta aynı kırk sorgunun üç kurulumda koşturulması ve erişim ile üretimin iki ayrı sütun olarak basılması: erişimsiz taban üretimde 0,1750 tutarken alan içi gömmeyle kurulan hat erişim anmasını 0,9500'e, üretimi 0,9250'ye çıkarıyor, alan dışı gömmeyle kurulan aynı hat ise anmayı 0,1750'de bırakıp üretimi 0,0500'e, yani tabanın altına düşürüyor. Bedel yan yana yazılıyor: 3174 belirteçten 5343 belirtece, sıfır erişim adımından yirmi yedi bin yedi yüz yirmi adıma, doğru yanıt başına 453,4 belirteçten 144,4 belirtece ve yanlış parçalı kurulumda 2706,5 belirtece. Altı tohumun koşumu bu iş yükünün eşiğini 0,0750 olarak veriyor ve doğru parça gelen otuz sekiz sorgunun biri yine de yanlış yanıtlanıyor.
İçindekiler
Önceki konunun altı dersi tek bir işi yaptı: bir sorguya karşılık dağarcıktan bir parça buldu. Gömme bir arama anahtarı olarak kuruldu, alan uyumunun kaybı ölçüldü, benzerlik ölçütü seçildi, tam taramanın yerine dizinli arama kondu, meta veri süzgeci eklendi ve iki sıralama birleştirildi. Altısında da ölçü aynı yerdeydi: getirilen parça doğru muydu.
Sorulmayan şey, o parçanın modele verildiğinde ne yaptığıdır. Erişim artırılmış üretim, dağarcıktan seçilen parçaları isteme koyup modeli o parçalarla çağırmaktır. Bu dersin kurduğu kural on altı ders boyunca sürer: erişim ile üretim ayrı ölçülür. İkisi tek sayıya indirildiğinde hangi aşamanın bozduğu görünmez.
- EH1. Kod bir benzeticidir; gerçek bir gömme ya da model uç noktası çağrılmaz. Dağarcık, kavram ekseni ve sorgular kurgudur, tohum 20260218.
- EH2. Gömmenin tanımı, açı benzerliği ve komşuluk M27/K06’nın doğal dil işleme kursunda ölçüldü ve tekrarlanmaz. Burada gömme yalnız bir arama anahtarıdır.
- EH3. Her kavramın belge dilinde bir yüzeyi (
kademe esigi), sorgu dilinde başka bir yüzeyi (hangi dilimdeyim) vardır ve ikisi hiçbir belirteç paylaşmaz: abonenin sorduğu sözcükle kaydın yazıldığı sözcük aynı değildir. - EH4. Benzeticinin iç izi belge dilini tanır, sorgu dilinin ise yalnız yedi kavramlık bölümünü tanır. Erişimsiz tabanın tek kaynağı budur.
- EH5. Erişim birimi bu derste kaynağın kendi paragraf sınırıdır ve buna parça denir; sınırın bir karar olduğu üçüncü derste ölçülür.
- EH6. Erişim anması, hedef kavramı taşıyan en az bir parçanın ilk üçte bulunma payıdır; erişim kesinliği, ilk üçteki hedef kavramlı parçaların oranı; sınıf isabeti ilk üçün hedef sınıftan gelme oranı. Sınıf isabeti kolay ölçüttür, kavram isabeti zor olandır.
- EH7. Üretim ölçüsü, yanıtın hedef kavramı adıyla vermesidir ve erişim ölçüsüyle aynı sütunda toplanmaz. Hız sınırı çağrı sayısına bağlıdır: kırk çağrının otuz yedincisi boş döner, üç kurulumda da aynı yerde olduğu için karşılaştırmayı bozmaz.
Dağarcık ve Ölçü Birimi
Aşağıdaki blok kurgu dağarcığı, kavram ekseni, gömme benzeticisi ve sorgu kümesini kurar. Yirmi kavramın her biri bir sınıfa bağlıdır ve iki yüzeyle yazılır.
# KURGUDUR. Asagidaki dagarcik, kavram ekseni ve gomme bir benzeticidir; gercek bir # gomme uc noktasi cagrilmaz. Tohum 20260218. TOHUM, M32 = 20260218, 0xFFFFFFFF BOYUT = 32 def uretec(t): x = ((t ^ (t >> 16)) * 2246822507) & M32 x = ((x ^ (x >> 13)) * 3266489909) & M32 s = [(x ^ (x >> 16)) & M32] def sonraki(): s[0] = (s[0] * 1664525 + 1013904223) & M32 return s[0] / 4294967296 return sonraki def ayrik(u, w): t = 0.0 for i, x in enumerate(w): t += x if u < t: return i return len(w) - 1 def belirtecle(m): b = [] for s in m.lower().replace(",", " , ").split(): while len(s) > 5: b.append(s[:5]) s = s[5:] b.append(s) return b # ---- KURGU anlam ekseni: her kavramin belge dilinde ve sorgu dilinde ayri yuzeyi var SINIF = ["tarife", "ariza", "sayac", "kesinti", "bakim"] KOD = {"tarife": "TR", "ariza": "AR", "sayac": "SY", "kesinti": "KS", "bakim": "BK"} KAVRAM = { # kavram: (sinif, belge yuzeyi, sorgu yuzeyi) "basamak": ("tarife", "kademe esigi", "hangi dilimdeyim"), "birim": ("tarife", "birim ucret", "metrekup fiyati"), "abonetip": ("tarife", "abone tipi", "mesken mi isyeri mi"), "gecis": ("tarife", "tarife gecisi", "plan degistirme"), "arizakod": ("ariza", "ariza kodu", "hata numarasi"), "sizinti": ("ariza", "hat sizintisi", "su kacagi"), "basinc": ("ariza", "basinc dususu", "zayif akis"), "ekip": ("ariza", "saha ekibi", "gorevli ne zaman gelir"), "endeks": ("sayac", "endeks degeri", "sayac ustundeki rakam"), "okuma": ("sayac", "okuma yordami", "nasil kaydediliyor"), "degisim": ("sayac", "sayac degisimi", "cihaz yenileme"), "dogrula": ("sayac", "okuma dogrulamasi", "yanlis girilmis mi"), "planli": ("kesinti", "planli kesinti", "onceden duyurulan durma"), "duyuru": ("kesinti", "duyuru kanali", "nereden ogrenirim"), "sure": ("kesinti", "kesinti suresi", "ne kadar surer"), "geridonus": ("kesinti", "yeniden verme", "ne zaman gelir"), "periyot": ("bakim", "periyodik bakim", "duzenli kontrol"), "vana": ("bakim", "vana kontrolu", "musluk kapatma duzeni"), "filtre": ("bakim", "filtre degisimi", "temizleme parcasi"), "kalib": ("bakim", "kalibrasyon kaydi", "olcum ayari"), } ANAHTAR = list(KAVRAM) ORTAK = ["kayit", "bolge", "donem", "islem", "form", "onay", "not"] # ---- KURGU dagarcik BELGE = [] for i in range(200): r = uretec(TOHUM + 7919 * i) s = SINIF[ayrik(r(), [0.22, 0.24, 0.20, 0.18, 0.16])] kav = [k for k in ANAHTAR if KAVRAM[k][0] == s] ana = kav[int(r() * len(kav))] n = 2 + int(r() * 4) par, kavlar = [], [ana] for _ in range(n): y = kav[int(r() * len(kav))] kavlar.append(y) o = ORTAK[int(r() * len(ORTAK))] par.append(f"{KAVRAM[y][1]} icin {o} tutulur ve {KAVRAM[ana][1]} ile birlikte yazilir") BELGE.append({"kod": f"{KOD[s]}{i + 1:03d}", "sinif": s, "ana": ana, "kavram": kavlar, "baslik": f"{KAVRAM[ana][1]} yordami", "par": par}) # ---- KURGU gomme: yuzey once kavrama, kavram sonra boyuta dusuruluyor def _kavramla(m, alan=True): v = [0.0] * len(ANAHTAR) dm = " " + m.lower() + " " for i, k in enumerate(ANAHTAR): bel, sor = KAVRAM[k][1], KAVRAM[k][2] if bel in dm: v[i] += 1.0 if sor in dm: v[i] += 1.0 if alan else 0.0 # alan disi gomme sorgu dilini tanimaz if not alan: for o in ORTAK: if " " + o + " " in dm: for i in range(len(ANAHTAR)): v[i] += 0.05 return v IZDUS = [] for i in range(len(ANAHTAR)): r = uretec(TOHUM ^ (i + 1) * 2654435761) IZDUS.append([r() * 2 - 1 for _ in range(64)]) def gom(m, boyut=BOYUT, alan=True): k = _kavramla(m, alan) v = [0.0] * boyut for i, a in enumerate(k): if a: for j in range(boyut): v[j] += a * IZDUS[i][j % 64] n = sum(x * x for x in v) ** 0.5 return [x / n for x in v] if n else v def aci(a, b): return sum(x * y for x, y in zip(a, b)) # ---- KURGU sorgu kumesi: sorgu dili belge dilinden ayri SORGU = [] for i in range(40): r = uretec(TOHUM + 104729 * i) d = BELGE[int(r() * len(BELGE))] SORGU.append({"metin": f"{KAVRAM[d['ana']][2]} {ORTAK[int(r() * len(ORTAK))]}", "sinif": d["sinif"], "kavram": d["ana"]}) # ---- parca: bu derste birim, kaynagin kendi paragraf siniridir PARCA = [{"kod": d["kod"], "sinif": d["sinif"], "metin": p, "kavram": [k for k in ANAHTAR if KAVRAM[k][1] in p]} for d in BELGE for p in d["par"]] print("belge %d parca %d kavram %d sorgu %d parca basina %.1f belirtec" % (len(BELGE), len(PARCA), len(ANAHTAR), len(SORGU), sum(len(belirtecle(x["metin"])) for x in PARCA) / len(PARCA))) print("sinif", {s: sum(d["sinif"] == s for d in BELGE) for s in SINIF})
belge 200 parca 693 kavram 20 sorgu 40 parca basina 16.3 belirtec
sinif {'tarife': 52, 'ariza': 46, 'sayac': 39, 'kesinti': 32, 'bakim': 31}
Ölçek buradan okunur: altı yüz doksan üç parça, parça başına on altı belirteç. Bir sorgunun yanıtı on bin belirteçlik yığının içindedir ve bağlam penceresine sığan şey bunun yüzde biri kadardır.
Üç Kurulum
İkinci blok dil modeli benzeticisini kurar ve aynı kırk sorguyu üç kurulumda koşturur. Benzetici M28/K01’de kurulan aileden gelir: belirteç sayar, bağlam penceresi ve durdurma koşulu taşır, hız sınırına takılabilir, aynı istemi aynı tohumla çağırdığında aynı yanıtı verir. Tek uyarlama yanıt uzayıdır: model yirmi kavramdan birini yazar.
Erişimsiz taban modeli yalnız sorguyla çağırır. Erişimli kurulum alan içi gömmeyle en yakın üç parçayı isteme koyar. Yanlış parçalı kurulum aynı hattı alan dışı bir gömmeyle kurar ve elle bozulmuş bir düzenek değildir: sorgu dilini tanımayan bir gömme seçildiğinde ortaya çıkan hattın kendisidir.
import math # ---- KURGU dil modeli benzeticisi: yanit uzayi yirmi kavram PENCERE, EN_UZUN = 240, 24 ON_BILGI = {"sizinti", "basinc", "sure", "degisim", "vana", "duyuru", "gecis"} SERBEST = ["talep {k} kavramina baglandi ve kayda gecti", "{k} kaydi olusturuldu ilgili birime iletildi", "kaydiniz alindi ilgili birim donus yapacak"] SAYAC = [0] def izno(m): h = 2166136261 for c in m: h = ((h ^ ord(c)) * 16777619) & M32 return h def cagir(istem, tohum=TOHUM, sicaklik=0.6, en_uzun=EN_UZUN): SAYAC[0] += 1 b = belirtecle(istem) if len(b) > PENCERE: return {"durum": "baglam_asimi", "giris": len(b), "cikis": 0, "yanit": ""} if SAYAC[0] % 37 == 0: # hiz siniri cagri sayisina bagli return {"durum": "hiz_siniri", "giris": len(b), "cikis": 0, "yanit": ""} r = uretec(tohum ^ izno(istem)) dm = " " + istem.lower() + " " p = {k: 0.15 for k in ANAHTAR} for k in ANAHTAR: p[k] += 2.0 * dm.count(KAVRAM[k][1]) # belge dilini model taniyor if k in ON_BILGI and KAVRAM[k][2] in dm: p[k] += 2.0 # sorgu dilinin bilinen payi if sicaklik <= 0.0: k = max(sorted(p), key=lambda a: p[a]) else: w = [math.exp(p[a] / sicaklik) for a in sorted(p)] k = sorted(p)[ayrik(r(), [x / sum(w) for x in w])] y = k if "tek" in b else SERBEST[int(r() * 3)].format(k=k) cb = belirtecle(y) if len(cb) > en_uzun: cb, y = cb[:en_uzun], " ".join(cb[:en_uzun]) return {"durum": "tamam", "giris": len(b), "cikis": len(cb), "yanit": y} def oku(y): return next((s for s in y.split() if s in ANAHTAR), None) YONERGE = ("Talebi su kavramlardan birine bagla: " + " , ".join(ANAHTAR) + " . Yanit olarak tek kavram yaz . ") VEK = {True: [gom(x["metin"]) for x in PARCA], False: [gom(x["metin"], alan=False) for x in PARCA]} def kosum(kip, tohum=TOHUM, k=3): SAYAC[0] = 0 anma = kes = snf = dog = gir = cik = 0 for s in SORGU: if kip == "erisimsiz": istem = YONERGE + "Talep: " + s["metin"] else: alan = kip == "erisimli" v = gom(s["metin"], alan=alan) ug = sorted(range(len(PARCA)), key=lambda i: -aci(v, VEK[alan][i]))[:k] istem = (YONERGE + "Kaynak: " + " . ".join(PARCA[i]["metin"] for i in ug) + " . Talep: " + s["metin"]) h = [s["kavram"] in PARCA[i]["kavram"] for i in ug] anma += any(h) kes += sum(h) / k snf += sum(PARCA[i]["sinif"] == s["sinif"] for i in ug) / k y = cagir(istem, tohum) gir, cik = gir + y["giris"], cik + y["cikis"] dog += oku(y["yanit"]) == s["kavram"] n = len(SORGU) return {"anma": anma / n, "kes": kes / n, "snf": snf / n, "uretim": dog / n, "bel": gir + cik, "parca": 0 if kip == "erisimsiz" else k * n, "adim": 0 if kip == "erisimsiz" else len(PARCA) * n, "dogru": dog} print("kurulum ERISIM: anma kesinlik sinif URETIM BEDEL: belirtec parca" " adim belirtec/dogru") for kip in ("erisimsiz", "erisimli", "yanlis parca"): a = kosum("yanlis" if kip.startswith("yanlis") else kip) e = (" - - -" if kip == "erisimsiz" else " %.4f %.4f %.4f" % (a["anma"], a["kes"], a["snf"])) print("%-13s%s %.4f %6d %5d %6d %14.1f" % (kip, e, a["uretim"], a["bel"], a["parca"], a["adim"], a["bel"] / a["dogru"]))
kurulum ERISIM: anma kesinlik sinif URETIM BEDEL: belirtec parca adim belirtec/dogru erisimsiz - - - 0.1750 3174 0 0 453.4 erisimli 0.9500 0.9500 0.9500 0.9250 5343 120 27720 144.4 yanlis parca 0.1750 0.1750 0.2500 0.0500 5413 120 27720 2706.5
Tablonun Üç Okuması
Birinci okuma erişimin ne kattığıdır. Erişimsiz taban 0,1750’dir: kırk sorgunun yedisi doğru, ve o yedisi benzeticinin sorgu dilinden tanıdığı kavramlara denk gelenlerdir. Alan içi gömmeyle kurulan hat üretimi 0,9250’ye çıkarıyor; fark +0,7500, yani otuz sorgu.
İkinci okuma bedeldir. Toplam belirteç 3174’ten 5343’e çıkıyor (1,68 kat), her sorgu için üç parça getiriliyor ve dağarcığın tamamı taranıyor: sorgu başına altı yüz doksan üç karşılaştırma, kırk sorguda 27720 erişim adımı. Bu adım bir model çağrısı değildir ama bedavaya da gelmez. Doğru yanıt başına okunduğunda hesap tersine döner: 453,4 belirteçten 144,4 belirtece.
Üçüncü okuma bu kursun ikinci iddiasıdır: erişim de bozar. Yanlış parçalı kurulum tabandan daha çok belirteç harcıyor (5413) ve üretimi 0,0500’e, yani tabanın 0,1750’sinin altına düşürüyor. Getirilen parçalar belge dilinde yazılmıştır ve model belge dilini tanır, bu yüzden yanlış kavramları güvenle okur; erişimsiz modelin belirsiz tahmini, yanlış kaynağın kesin yanlışına dönüşüyor. Doğru yanıt başına bedel 2706,5 belirtece çıkıyor.
Erişim sütunu da iki sayıyla okunur: alan dışı kurulumda sınıf isabeti 0,2500, yani beş sınıf arasından rastgele seçim düzeyinde, kavram isabeti 0,1750. Tek bir isabet sayısı basılsaydı hangi ölçütün konuşulduğu belirsiz kalırdı.
Eşik ve İki Sütunun Ayrılması
Bir fark ancak koşum değişkenliğinden büyükse fark sayılır. Bu eşik M28/K03’te kendi iş yükünde ölçülmüştü; bu kurs onu devralmaz. Üçüncü blok aynı üç kurulumu altı tohumla koşturur ve ardından erişim ile üretim sütunlarının ayrıldığı yeri sayar.
print("kurulum alti tohumun uretim isabeti yayilim") esik = 0.0 for kip in ("erisimsiz", "erisimli", "yanlis"): v = [kosum(kip, TOHUM + i)["uretim"] for i in range(6)] esik = max(esik, max(v) - min(v)) print("%-13s %s %.4f" % (kip, " ".join("%.4f" % x for x in v), max(v) - min(v))) print("bu kursun esigi %.4f (kirk sorgunun %d'i)" % (esik, round(esik * 40))) SAYAC[0] = 0 gd = gy = 0 for s in SORGU: v = gom(s["metin"]) ug = sorted(range(len(PARCA)), key=lambda i: -aci(v, VEK[True][i]))[:3] if not any(s["kavram"] in PARCA[i]["kavram"] for i in ug): continue istem = (YONERGE + "Kaynak: " + " . ".join(PARCA[i]["metin"] for i in ug) + " . Talep: " + s["metin"]) d = oku(cagir(istem)["yanit"]) == s["kavram"] gd, gy = gd + d, gy + (not d) print("dogru parca gelen %d sorgu: %d dogru yanit, %d yanlis yanit" % (gd + gy, gd, gy))
kurulum alti tohumun uretim isabeti yayilim erisimsiz 0.1750 0.2250 0.2250 0.2000 0.2250 0.1500 0.0750 erisimli 0.9250 0.9250 0.9250 0.9250 0.9250 0.9250 0.0000 yanlis 0.0500 0.0500 0.0750 0.0750 0.1000 0.0500 0.0500 bu kursun esigi 0.0750 (kirk sorgunun 3'i) dogru parca gelen 38 sorgu: 37 dogru yanit, 1 yanlis yanit
Bu kursun eşiği 0,0750’dir: kırk sorgunun üçü. Bundan küçük bir üretim farkı bu iş yükünde ölçülmemiş sayılır. Yayılım kurulumdan kuruluma da değişiyor: erişimsiz tabanda 0,0750, erişimli hatta 0,0000. Kaynak verilmiş bir modelin çıktısı tohuma bağlı kalmıyor, çünkü doğru kavram öbürlerinin çok üstünde puan alıyor. Belirsizlik bilginin olmadığı yerde büyür; erişimin az yazılan ikinci kazancı budur.
Erişim ölçüsü ise tohumdan bağımsızdır, çünkü gömme ve sıralama belirlenimlidir. Eşik bu yüzden yalnız üretim sütununa uygulanır. İki sütunu ayrı tutmanın karşılığı son satırdır: doğru parça gelen otuz sekiz sorgunun otuz yedisi doğru yanıtlanıyor, biri yanlış. O sorguda arıza üretim aşamasındadır; tek bir sayı basılsaydı bu sorgu, parçayı getiremeyen iki sorguyla aynı kutuya düşerdi.
Özet
- Erişim artırılmış üretim, dağarcıktan seçilen parçaların isteme konup modelin o parçalarla çağrılmasıdır; kursun kuralı, erişim ile üretimin ayrı ölçülmesidir.
- Aynı kırk sorguda erişimsiz taban 0,1750, alan içi gömmeyle kurulan hat 0,9250 üretim veriyor.
- Bedel yazılmadan kazanç okunmaz: toplam belirteç 3174’ten 5343’e çıkıyor, sorgu başına üç parça ve 693 karşılaştırma ekleniyor; doğru yanıt başına belirteç ise 453,4’ten 144,4’e iniyor.
- Alan dışı gömmeyle kurulan aynı hat üretimi 0,0500’e, yani erişimsiz tabanın altına düşürüyor ve bunu daha çok belirteç harcayarak yapıyor: erişim de bozar.
- Bu iş yükünün ölçüm eşiği altı tohumlu koşumdan 0,0750 çıkıyor; erişimli hatta yayılım 0,0000.
- Doğru parça gelen otuz sekiz sorgunun biri yine de yanlış yanıtlanıyor.
Sonraki Adım
Bu derste dağarcık hazır geldi: temiz paragraflar, yerli yerinde sınırlar, ayrı tutulmuş kod ve sınıf alanları. Gerçek bir kaynak böyle gelmez; saha kayıtları form başlıkları, sayfa altlıkları, satır ortasından bölünmüş cümleler ve metnin içine gömülmüş kod alanları taşır. Bu artıkların erişime ne yaptığı hiç sorulmadı: hangi hazırlığın anmayı yükselttiği, ve hazırlığın kendisinin neyi attığı. Sonraki ders aynı dağarcığın ham hâlinden başlar, üç hazırlık düzeyini aynı sorgu kümesinde ölçer ve kaba bir temizleme kuralının attığı satırları sayar.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.