古堡里的中國年_貨運

※評比南投搬家公司費用收費行情懶人包大公開

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

  皇城相府內的民俗表演。
  資料圖片

  冬雪至,年味濃。位於山西省晉城市的皇城相府中,雪花從紫雲山前山河樓旁飄下,落在這座有600年歷史的明清古堡。

  皇城相府是沁河流域數千座古堡之一。明末清初,沁河流域修建起大大小小的城堡,城牆、護城河、瞭望樓、磨坊、水井一應俱全,更以內外雙城聞名於世。這裡有大型院落16座,房屋640餘間。御書樓金碧輝煌,中道庄巍峨壯觀,斗築居府院連綿,河山樓雄偉險峻,是一處罕見的明清城堡式住宅建築群,雖經歷代戰火,仍保存完好。

  明崇禎六年,陳廷敬伯父陳昌言為避戰亂始建皇城相府的內城“斗築居”。清康熙年間,陳廷敬又修建了外城。康熙皇帝曾兩次來到皇城相府,且御筆親書“午亭山村”,成為一塊金字招牌。

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

  2020年新春,皇城相府特別推出“玩文化‘潮’年,‘趣’皇城相府”主題系列新春廟會。融合創意互動、線上打卡、線下體驗、非遺表演、非遺市集、特色美食、花車巡遊等精彩內容,奉上一場精彩絕倫的文化大餐。

  春節期間,在皇城相府走走,你可以真真切切地觸摸歷史。

  行走在古樸厚重的街巷,掀開珠簾,跨步入室,你會不禁感嘆歷史在這裏靜止;夜宿郭峪古城,每晚的打鐵花表演會擦亮古城的夜空;逛逛廟會,你可以走進非遺文化展,近距離欣賞本土和網紅非遺文化;跟着“花車巡遊”,你可以快速地融入到這一片歡樂祥和的年節氛圍中;除了遊客熟悉的表演外,浸入式、行進式的實景劇《再回相府》再次登場,帶你了解一代名相陳廷敬的故事。

  有文化、有故事,皇城相府帶你過個熱鬧的中國年。

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

※智慧手機時代的來臨,RWD網頁設計為架站首選

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

剪窗花過年_網頁設計公司

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

  圖為中國剪紙。
  劉建華攝(影像中國)

  圖為北京前門大街的迎春燈籠。
  郭俊鋒攝(影像中國)

  過春節,一般年前最忙。到大年初一,人們就可以盡享清福,闔家歡樂了。年前,男主人、女主人都要外出忙着採購年貨,一些婦女和孩子留在家裡,洒掃庭除之後,圍坐在炕頭和桌前,開始剪窗花了。

  這樣的風俗,有兩方面原因。

  一是,剪出的窗花貼到窗上,和大門兩旁貼的春聯、大門中央貼的門神、屋子牆上貼的福字,和房檐門楣上掛的吊錢,一定都要在大年三十之前完成,才算是過年的樣子。清末竹枝詞里說:“掃室糊棚舊換新,家家戶戶貼宜春。”其中的“貼”字說的就是準備過年這樣必需的程式。

  另一面,和過年的時候家裡人不許動刀剪的民俗有關(還有不許掃地倒臟土等,都是防止不吉利的說法)。清時詩人查慎行有詩:“巧裁幡勝試新羅,畫彩描金作鬧蛾。從此刀剪閑一月,閨中針線歲前多。”這裏說的巧裁新羅,畫彩描金,就包含有剪窗花,從此刀剪閑一月,後來改成到正月十五;再後來到破五;現在,已經徹底沒有這個風俗了。

  春聯、門神、福字、窗花和吊錢,這五項過年之前之必備,我稱之為過年五件套。和後來結婚時候一度流行的手錶、自行車和大衣櫃這三件套的說法相類似。只是,結婚三件套,早已被時代的發展所淘汰,而過年這五件套,幾百年過去了,至今依然風俗變化不大,除了吊錢如今在北京見到的少了,其餘四種,仍然在過年前看許多人家在忙乎張羅。因為這是過年必備的慶祝儀式的硬件標準。可見,民俗的力量,在潛移默化中,代代傳承。

  到正月十五燈節之前,再加上各家大門前掛上一盞紅燈籠,就是過年必備的六件套。這六件套,全部都是紅顏色,過年前後這一段時間里,全國各地,無論鄉間,還是城市,到處是這樣一片中國紅,那才叫過年,是過年的色彩。如果說過年到處是這樣紅彤彤一片的海洋翻滾,那麼,窗花是其中奪目的浪花簇擁。

  過去的歲月里,年前要準備的這五件套,除了門神尉遲恭秦叔寶的形象複雜,要到外面買那種木刻現成的之外,其餘四件,普通百姓人家,都是要自己動手做的。這和年三十晚上的那頓餃子必須得全家動手包一樣,參与在過年的程式之中,才像是過年的樣子。普通人家剪窗花,是和貼春聯、掛吊錢,包括做門神、寫福字一樣,都只用普通的大紅紙。各家都須到紙店裡買大紅紙。大紅紙暢銷得很。

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

  那時候,家附近有兩家老字號的紙店,一家是南紙店,叫公興號,在大柵欄東口路南;一家是京紙店,叫敬庄號,在興隆街,我們大院後身。家裡人一般都將這項任務交給我們小孩子,我們都願意舍近求遠去公興號,一是那裡店大,紙的品種多;二來路過前門大街,到處是賣各種小吃的店鋪和攤子,我們可以將買紙剩下的錢買點兒吃的解饞。家裡人都囑咐我們買那種便宜的大紅紙。其實,不用囑咐,我們都會買最便宜的,這樣剩下的錢會多點兒,買的吃食也會多點兒呢。

  有一陣子,公興號流行賣一種電光紙,我們又叫它玻璃紙,因為它像玻璃一樣反光,一閃一閃。我們都喜歡,便買回家。家裡大人不樂意,看着就撇嘴,讓我們立馬兒拿回去換紙,一準覺得還是傳統的那種大紅紙好。

  過去年月里普通人家房子的紙窗,貼的都是高粱紙,很薄,透光性好。傳統的大紅紙也很薄,做成窗花,貼在這樣的花格紙窗上,很是四襯適合。清末《燕都雜詠》有一首說:“油花窗紙換,掃舍又新年。戶寫宜春字,囊分壓歲錢。”詩後有注:“紙繪人物,油之,剪貼窗上,名‘窗花’。”詩中所說的油花窗紙,指的應該就是這種高粱紙,紅紅的窗花貼在上面,紅白相映,屋裡屋外,看着都透亮,紅艷艷的,顯得很喜興。電光紙厚,貼在這樣的花格紙窗上,不僅不透亮,還反光,沒有那種裡外通透的感覺。確實是什麼衣配什麼人,什麼鞍配什麼馬,傳統的窗花用紙,和老式的紙窗兩兩相宜。老祖宗傳下來的玩意兒,有它的道理。

  後來,經濟條件好些了,各家的窗子換成玻璃的,還是覺得貼這種傳統大紅紙剪成的窗花好看。那種電光紙,到底沒能剪成窗花,亮相在我們的窗戶上。

  窗花,是老祖宗傳下來的,既是手藝,也是民俗;既可以是結婚時的裝點,更形成了過年必不可少的一項內容。窗花的歷史悠久,有人說自漢代發明了紙張之後就有了窗花,這我不大相信,紙張剛剛出現的時候,應該很貴,不可能普遍用於窗花。有人說南北朝時對馬團花和對猴團花中就有了鋸齒法和月牙法等古老的剪紙法;有人說唐朝就有,有李商隱的詩為證:“鏤金作勝傳荊俗,剪綵為人起晉風”;也有人說窗花流行於宋元之後……總之,窗花的歷史悠久。

  我私下猜想,窗花最初是用刀刻,然後轉化為剪裁。刀刻出的圖案,應該受到過更早時的石刻或青銅器的雕刻影響,藝術總是相通的,相互影響和借鑒是存在的。從石刻到剪紙,從刀到剪,只是工具和材料的變化而已。剪和刻的區別,還在於剪是要把紙先折成幾疊,是在石頭上無法做到的。別看只是這樣看似簡單的幾疊,卻像變魔術一樣,讓剪紙變成了獨特的藝術。

  窗花,應該是剪紙的前身。窗花也好,剪紙也好,不像石刻或青銅器雕刻,多在王公貴族那邊,而是更多在民間,其民間的元素更多更濃。窗花,又是農耕時代的產物,所以,它的內容更多的是花草魚蟲、飛禽走獸、農事稼穡、民間傳說、神話人物,以至後來還有八仙過海、五福捧壽等很多戲劇內容,可以說是花樣繁多,應有盡有。只有正月十五燈節時的彩燈上描繪的內容,可以和窗花有一拼。燈上的圖案,在窗花上大多可以一一找到對應,只不過,在窗花上刪繁就簡,都變成大紅紙一色的紅。這便是窗花獨到之處,一色的紅,配窗子一色的白,如果過年期間趕上一場大雪,紅白對比得格外強烈,就更漂亮了。

  民間藏龍卧虎,窗花有簡有繁。有的很豐富,我從來沒有見過。前面所引的《燕都雜詠》詩后還有一注,說有這樣的窗花,是“或以陽起石揭薄片,繪花為之”。這種類似拓印式的窗花,我沒見過。《帝京風物略》中說:“門窗貼紅紙葫蘆,曰收瘟鬼。”這風俗和年三十之夜踩松柏枝謂之驅鬼的意思是一樣的。大年三十的夜晚,踩松柏枝,我沒有踩過,那時我們院子里有人買來秫秸稈,讓我們小孩子踩,意思是一樣的。但是,這種貼紅紙葫蘆的窗花,我也沒見過。《燕京雜記》中說:“剪紙不斷,供於祖前,謂之‘阡張’。”過年期間,如此誇張的剪紙,是窗花的變異,我更是沒見過。

  小時候,我看鄰家的小姐姐或阿姨剪窗花,順便要幾朵,拿回家貼在窗上。我有了兒子之後,孩子小時候磨我教他剪窗花,我不會,便把他推給我母親,告訴他:奶奶會,你找奶奶去!其實,奶奶只剪過鞋樣子,哪裡會剪窗花?但被孩子磨得沒法子了,只好從針線笸籮里拿出剪子,把大紅紙一折好幾疊,便開始隨便亂剪一通。誰想到,兒子把紅紙抖摟開一看,儘管不知道剪的是什麼圖案,但那樣像抽象派的圖案,還挺新鮮,挺好看呢!這樣剪窗花,一點兒都不難嘛,兒子抄起剪刀,也開始學奶奶的樣子,剪出一床窗花來。我家那年春節的窗戶上,貼的全是奶奶和她的小孫子剪的窗花。

  流年似水,一晃又到春節。兒子的兩個孩子,一個八歲,一個十歲了。他們跟爸爸新學會了剪紙,年前剪了一堆的窗花,比他們的爸爸當年剪得有章法多了。雖然人在國外,但兩人準備春節前送給每個同學一個窗花,讓他們那些外國同學也知道中國人過年貼的窗花是什麼樣子。視頻通話的時候,我讓他們兩人先別忙着把窗花送同學,一人選出自己最得意的一個窗花,先送給我。今年貼在我家的窗上,他們和他們的窗花,陪我們老兩口一起過年。

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

中國製 TESLA Model Y 上線官網,台灣開賣時間也不遠了?_網頁設計公司

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

在2021年的1月1日,中國特斯拉官網突然上架的 TESLA Model Y 的產品頁面,由於中國特斯拉除了 Model X、Model S 與 Model 3 性能版以外已經全面進入中國自製階段(3P也快進入全中國產)而且還可以外銷歐洲,這次的更大的意義在於連 Model Y 也開始全面中國廠生產,另外根據未證實的小道消息指稱,台灣 TESLA Model Y 也可能在今年春天開始在台上市販售。

中國製 TESLA Model Y 上線官網

這次中國特斯拉官網上架的是 Model Y 長續航全輪驅動版與 Performance 高性能版兩種規格,而沒有之前傳言可能更便宜、續航更好的 RWD 版本,兩輛車主要的差異在於輪穀大小(19/20 vs 21吋)、車身重量(1997 vs 2010)、續航(594 vs 480KM WLTP)、最高時速(217 vs 241 KM)與百公里加速(5.1 vs 3.7 秒),電池部分可能採用最近爭議頗大的磷酸鐵鋰電池:

▲圖片來源中國特斯拉。

價格方面,長續航版折合約為台幣146.5萬,高性能版約為159.5萬台幣(超過30萬人民幣無電動車購車補助),都比台灣的 Model 3 SR+ 便宜(中華民國萬萬稅),另外有傳言台灣應該在春天的時候也會開賣由美國進口的 TESLA Model Y,個人不負責猜測價格約在210萬~230萬左右,由於 Model Y 是車身比較寬敞的後掀背車款,比較受到喜歡 SUV 車型的民眾喜愛,預料開賣時應該會有另一波搶購熱潮:

實車在路上也被直擊了:

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

Tesla MIC Model Y delivery may start earlier than all we expected. https://t.co/rPMeUvXto2 pic.twitter.com/i0vyyDaFAd

— Vincent (@vincent13031925) January 1, 2021

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

廣告不實!SanDisk Extreme microSDXC UHS-I(V30)(A2)256GB 記憶卡開箱實測_台北網頁設計

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

千元以下256GB V30 記憶卡測速這系列原本是我自己個人無聊的資料整理,不過做多了之後發現不拆開的話幾乎沒有 SEO,所以現在開始會把每個品牌分開測試,另外超過千元的 512 GB 或以上的容量也會開始寫,不過缺點就是記憶卡好像收太多了,這次要分享的是 SanDisk Extreme microSDXC UHS-I(V30)(A2)256GB 記憶卡,Sandisk這個品牌不用多說了,龍頭品牌終身保固,評價一直不錯。

SanDisk Extreme microSDXC UHS-I(V30)(A2)256GB 記憶卡

這張SanDisk Extreme microSDXC UHS-I(V30)(A2)256GB 記憶卡是 PCHOME 雙11購物特價時購買,特價939元(現在恢復原價 1299元),公司貨終身保固,在包裝上標誌V30 A2 等級讀取 160 MB、寫入高達90MB,講實話本來以為是吹牛皮:

一測不得了,讀寫速度是目前測過最好表現,ATTO DISK BENCHMARK 速度約 169.1MB讀取/104.6MB寫入:

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

TxBENCH則是跑出 168MB讀取/104.6MB寫入,符合 V30 標準,這片大概是目前我測過最快的高速卡,與宣稱數值不一樣呀,超過官方數據是哪招?只能說它廣告不實了,如果有特價別猶豫立刻入手:

「持續更新」市售千元以下 256GB V30 等級記憶卡讀寫效能比一比

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

小米有品推出 Lydsto 手持吸塵打氣機,眾籌價約 860 元_網頁設計公司

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

輕巧的手持吸塵器是許多開車族或其他有隨手吸塵需求的民眾必備的小物之一,而車用、家用場景也有時會需要為輪胎等物品進行打氣,這時通常得另外再添購一款小型的電動打氣機產品。近期在小米有品的眾籌商品「Lydsto 手持吸塵打氣機」就一次滿足了吸塵和打氣兩項需求,在日常收納也更輕鬆。

小米有品推出 Lydsto 手持吸塵打氣機,眾籌價約 860 元

最近在小米有品登場的 Lydsto 手持吸塵打氣機,擁有簡約的外觀設計就像是小巧輕便的手持吸塵器的小尺寸,而它不僅能用於吸塵使用,還可以作為打氣機檢測胎壓、打氣使用。

Lydsto 手持吸塵打氣機搭載高性能無刷馬達,最大轉速可達 80000 轉/分鐘、最大吸力可達 10000Pa 。

 Lydsto 手持吸塵打氣機內建雙重過濾系統、採用 304 不鏽鋼初效濾網,可攔截大顆粒碎屑和灰塵,二層 HEPA 級濾網則能有效過濾細小灰塵、預防二次污染,也能用清水清洗循環使用。
吸塵模式方面, Lydsto 手持吸塵打氣機擁有低檔和高檔兩種吸塵模式,在低檔約可使用 30 分鐘、能滿足基本清潔需求;高檔可使用 15 分鐘、能提供更大吸力的深層清潔使用。

續航方面, Lydsto 手持吸塵打氣機內建 25000mAh 大容量鋰電池可實現便利的手持吸塵使用。採用傾斜吸口和扁形吸嘴設計,在車室內裝、座椅,或是家裡的地毯、床、沙發等角落都能輕鬆吸塵清理:

電動打氣方面, Lydsto 手持吸塵打氣機通過內部散熱風扇和通風孔設計,除降低打氣過程中的升溫現象、確保馬達能高效運轉。而獨特的汽缸設計,可實現 10公升/分鐘 的超大氣流量,最大充氣氣壓達到 150PSI ,在滿電狀態下約可旋充滿 2 條汽車輪胎。打氣也能用於其他像是自行車、平衡車、滑板車、籃球等物品充氣需求,以一顆籃球來計算約可充 60 次。
此外,也能運用內建的胎壓檢測來掌握正確的胎壓以確保行車安全,打氣也能設定好期望的胎壓值再開始充氣。

Lydsto 手持吸塵打氣機在機身側邊配備高亮度 LED 氣壓顯示螢幕,可喜善 kPa、PSI、Bar 三種氣壓單位,也支持智慧觸控設計,能輕觸面板進行控制:

採用 USB Type-C 充電接口,對於日常生活要為 Lydsto 手持吸塵打氣機充電使用也更加容易,亦可在車內直接充電。

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

價格部分, Lydsto 手持吸塵打氣機目前剛在小米有品展開眾籌,眾籌價為人民幣 199 元(約合新台幣 860 元),建議售價則為人民幣 299 元(約合新台幣 1,290 元)。

圖片/消息來源:小米有品

延伸閱讀:
小米11 Pro 傳聞規格首次曝光:預計 2021 上半年推出, Redmi K11 將為同期最便宜 S888 旗艦新機之一

小米氮化鎵GaN充電器Type-C 55W 推出:體積更小、價格更親民

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

GitHub 熱點速覽 Vol.22:如何打造超級技術棧_網頁設計

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

作者:HelloGitHub-小魚乾

摘要:build-your-own-x,無論是新手還是老手,這都是一個指向標。方向有了,剩下就是時間和實踐的事情,收集了大量可用於軟件和 Web 開發的 Public APIs 無疑是你實踐之路的好搭檔,而拼寫檢查:vscode-spell-checker 也能讓你實踐更加順利,提升你的開發效益,節省研發時間。除了 VSCode 的插件幫你更好地實踐技術,responsively-app 這種為調試響應式頁面的瀏覽器也是一個好幫手。

以下內容摘錄自微博@HelloGitHub 的 GitHub Trending,選項標準:新發布 | 實用 | 有趣,根據項目 release 時間分類,發布時間不超過 7 day 的項目會標註 New,無該標誌則說明項目 release 超過一周。由於本文篇幅有限,還有部分項目未能在本文展示,望周知

  • 本文目錄
    1. 本周特推
      1.1 macOS 免費體驗:macos-virtualbox
    2. GitHub Trending 周榜
      2.1 Web 開發提速:responsively-app
      2.2 SQL 分析:DuckDB
      2.3 UI 組件管理器:Storybook
      2.4 Demo 之母:RealWorld
      2.5 API 集大成者:Public APIs
      2.6 公式推導解析:pumpkin-book
      2.7 超級技術棧:build-your-own-x
      2.8 架構師技術圖譜:awesome-architecture
    3. 本周 GitHub Trending #VSCode 插件# 主題的主力軍
      3.1 頁面自動加載:vscode-live-server
      3.2 拼寫檢查:vscode-spell-checker
      3.3 Vim 仿真器:VSCodeVim
    4. 推薦閱讀

1. 本周特推

1.1 macOS 免費體驗:macos-virtualbox

本周 star 增長數:2800+

想免費體驗 macOS 系統嗎?macos-virtualbox 是一個 macOS 虛擬機,支持 Windows、Linux。默認安裝僅要求用戶耐心地坐下,並且在腳本提示按不到十次的 Enter 鍵,無需與虛擬機進行交互。當前支持 macOS Catalina(10.15),Mojave(10.14)和High Sierra(10.13)。

GitHub 地址→https://github.com/myspaghetti/macos-virtualbox

2. GitHub Trending 周榜

2.1 Web 開發提速:responsively-app

本周 star 增長數:1700+

responsively-app 是來自印度的開發者 Manoj Vivek 為調試響應式頁面的開發的瀏覽器,主要有以下特性:

  • 跨設備鏡像用戶交互
  • 可定製的預覽布局,以滿足開發需求
  • 一個方便的元素檢查支持所有設備預覽
  • 30+ 內置設備配置文件,可選擇添加自定義設備。
  • 一鍵截圖所有設備。
  • 支持開發者熱重載

GitHub 地址→https://github.com/manojVivek/responsively-app

2.2 SQL 分析:DuckDB

本周 star 增長數:650+

DuckDB 是一款嵌入式關係型分析數據庫,主要用於嵌入其他程序執行快速的 SQL 分析查詢,官方稱其為“分析型數據庫中的 SQLite”,使用 C 或 C++ 可將數據庫服務器直接嵌入到應用程序中。特性:

  • 語法解析:使用 PostgreSQL 解析器,該解析器被重新打包為獨立庫
  • shell:對 SQLite shell 進行了調整,以使用 DuckDB
  • 測試:使用 SQLite 中的 SQL 邏輯測試來測試 DuckDB
  • 模糊查詢:使用 SQLsmith 生成隨機查詢以進行額外的測試
  • Date Math:使用 MonetDB 中的 Date Math 組件
  • SQL 窗口函數:DuckDB 的窗口函數實現使用分段樹聚合,如 Viktor Leis、KanKundhikanjana、Alfons Kemper 和 Thomas Neumann
  • 執行引擎:矢量化執行引擎的靈感來源於 PeterBoncz、Marcin Zukowski 和 Niels nes 的論文 “MonetDB/X 100:超級流水線查詢執行”
  • 優化器:DuckDB 的優化器從 Guido Moerkotte 和 Thomas Neumman 的論文 “動態規劃回擊” 以及 Thomas Neumann 和 Alfons Kemper 的“取消任意查詢嵌套”中獲得靈感
  • 併發控制:我們的 MVCC 實現靈感來自於 Thomas Neumann,Tobias Mühlbauer 和 Alfons Kemper 的論文“用於主存數據庫系統的快速序列化多版本併發控制”
  • 存儲:DuckDB 使用 DataBlock 作為持久存儲,如 Harald lang、Tobias Mühlbauer、Florian Funke、Peter Boncz、Thomas Neumann 和 Alfons Kemper 在“數據塊:利用矢量化和編譯的壓縮存儲上的混合 OLTP和OLAP” 中描述的那樣
  • 正則表達式:DuckDB 使用 Google 的 RE2 正則表達式引擎

GitHub 地址→https://github.com/cwida/duckdb

2.3 UI 組件管理器:Storybook

本周 star 增長數:550+

Storybook 是一個 UI 組件的開發環境,允許你瀏覽組件庫、查看每個組件的不同狀態以及交互式開發和測試組件。

GitHub 地址→https://github.com/storybookjs/storybook

2.4 Demo 之母:RealWorld

本周 star 增長數:450+

RealWorld 向大家展示了如何使用 React/Angular 等框架在 Node/Django 等平台上構建類 Medium 博客平台。開發者可以把它們混合起來,因為它們都遵循相同的 API 規範。

GitHub 地址→https://github.com/gothinkster/realworld

2.5 API 集大成者:Public APIs

本周 star 增長數:1850+

Public APIs 收集了可用於軟件和 Web 開發的大量 API,包括金融、防詐騙、文字分析、動漫、健身等等 50 + 個分類 API,如果你要找資源不妨試試這個公共 API 項目 ​​​​

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

GitHub 地址→https://github.com/public-apis/public-apis

2.6 公式推導解析:pumpkin-book

本周 star 增長數:600+

pumpkin-book 是《機器學習》(西瓜書)公式推導解析,包括:模型評估與選擇、線性模型、決策樹、神經網絡、支持向量機、貝恭弘=叶 恭弘斯分類器、集成學習、降維與度量學習、特徵選擇與稀疏學習等等內容。

GitHub 地址→https://github.com/datawhalechina/pumpkin-book

2.7 超級技術棧:build-your-own-x

本周 star 增長數:2550+

build-your-own-x 是一個收錄了大量資源的項目,它旨在教你構建一些專屬於自己的技能,內容包括:3D 渲染器、增強現實、區塊鏈、遊戲、搜索引擎、命令行工具、神經網絡、視覺識別、bot 等等 27 個大類。

GitHub 地址→https://github.com/danistefanovic/build-your-own-x

2.8 架構師技術圖譜:awesome-architecture

本周 star 增長數:100+

awesome-architecture 架構師技術圖譜包括:分佈式、前端、大數據、存儲、微服務、推薦系統、框架 、消息隊列、編程語言、設計模式、重構、集群等內容。

GitHub 地址→https://github.com/toutiaoio/awesome-architecture

3. 本周 GitHub Trending #VSCode 插件#主題的主力軍

一款好用的插件能提高我們的開發效率,VSCode 作為 Top IDE,它豐富的生態系統也是大多數開發者選擇使用它開發軟件的原因,在本期的主題項目中,小魚乾選擇了 3 個超好用的插件希望能提高你的開發效率。

3.1 頁面自動加載:vscode-live-server

vscode-live-server 是一個允許我們在更改 IDE 代碼時自動重新加載 Web 頁面的插件。

GitHub 地址→https://github.com/ritwickdey/vscode-live-server

3.2 拼寫檢查:vscode-spell-checker

vscode-spell-checker是一款拼寫檢查小工具,可幫你報告一些常見的拼寫錯誤,尤其適合駝峰式代碼。

GitHub 地址→https://github.com/streetsidesoftware/vscode-spell-checker

3.3 Vim 仿真器:VSCodeVim

VSCodeVim 是一個用於 Visual Studio Code 的 Vim 仿真器,為你的文本編輯器帶來 Vim 的強大功能。

GitHub 地址→https://github.com/VSCodeVim/Vim

推薦閱讀

  • GitHub 熱點速覽 Vol.21:Go 新手起手式,學就完事兒了
  • GitHub 熱點速覽 Vol.20:VSCode 插件全家桶新增畫圖小能手
  • GitHub 熱點速覽 Vol.19:如何叩響大廠的門?

以上為 2020 年第 22 個工作周的 GitHub Trending 如果你 Pick 其他好玩、實用的 GitHub 項目,記得來 HelloGitHub issue 區和我們分享下喲

HelloGitHub 交流群現已全面開放,添加微信號:HelloGitHub 為好友入群,可同前端、Java、Go 等各界大佬談笑風生、切磋技術~

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

七個生產案例告訴你BATJ為何選擇ElasticSearch!應用場景和優勢!_貨運

※智慧手機時代的來臨,RWD網頁設計為架站首選

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

本文來源於公眾號【胖滾豬學編程】,轉載請註明出處。

從今天開始,想和你一起死磕ElasticSearch,學習分佈式搜索引擎,跟着胖滾豬就對了!

既然是ES的第一課,那麼最重要的是讓你愛上它!不想說那些單純的優勢、概念了,直接上大廠的生產案例,才是最能吸引你的!跟着大廠走,沒問題的!

為啥選擇ES?

一個技術服務組件,首先需要了解全面它的使用場景,才能更針對性的去研究及推廣。因此第一要務是搞懂為什麼要學習ElasticSearch,開頭po先一張排行圖,大哥的地位可不是瞎搞來的,沒點實力能上位?憑這排名就是你要學習它的理由!

憑啥排這麼前呢?不就是個搜索引擎嗎。額,也許提到Elasticseach,你第一反應就是”搜索引擎”。類似百度搜索、淘寶搜索那種。而我寫這篇文章就是為了糾正你這個”錯誤”的觀點。

Elasticseach 確實是做搜索引擎出家的,但是到現在已經進化成了一個全能型的數據產品。因此你的思維決不能限制在搜索引擎上。

本文通過一線大廠的八個案例,全方位讓你了解ElasticSearch的應用場景和優勢,包括:

  • 日誌實時分析
  • 搜索服務
  • 數據分析
  • 數據監控
  • 查詢服務
  • 後端存儲

ElasticSearch在騰訊的應用

ElasticSearch在騰訊的應用非常廣泛,主要有三:日誌實時分析場景、搜索服務、時序數據分析。

  • 搜索服務: 例如像騰訊文檔基於 ES 做全文檢索,電商客戶拼多多、蘑菇街等大量的商品搜索都是基於 ES。
  • 日誌分析: 這個是 ES 應用最廣泛的領域,支持全棧的日誌分析,包括各種應用日誌、數據庫日誌、用戶行為日誌、網絡數據、安全數據等等。ES 擁有一套完整的日誌解決方案,可以秒級實現從採集到展示。
  • 時序分析: 典型的場景是監控數據分析,比如雲監控,整個騰訊雲的監控都是基於 ES 的。此外還包括物聯網場景,也有大量的時序數據。時序數據的特點是寫入吞吐量特別高,ES 支持的同時也提供了豐富的多維統計分析算子。

日誌實時分析

典型日誌如下:

  • 運營日誌,比如慢日誌、異常日誌,用來定位業務問題;
  • 業務日誌,比如用戶的點擊、訪問日誌,可以用來分析用戶行為;
  • 審計日誌,可以用於安全分析。ES 很完美的解決了日誌實時分析的需求,它具有如下特點:

Elastic 生態提供了完整的日誌解決方案,任何一個開發、運維同學使用成熟組件,通過簡單部署,即可搭建起一個完整的日誌實時分析服務。

  • 在 Elastic 生態中,日誌從產生到可訪問一般在 10s 級。相比於傳統大數據解決方案的幾十分鐘、小時級,時效性非常高。ES 擁有一套完整的日誌解決方案(ELK),可以秒級實現從採集到展示。

  • 由於支持倒排索引、列存儲等數據結構,ES 提供非常靈活的搜索分析能力。

  • 支持交互式分析,即使在萬億級日誌的情況下,ES 搜索響應時間也是秒級。

日誌是互聯網行業最基礎、最廣泛的數據形式,ES 非常完美的解決了日誌實時分析場景,這也是近幾年 ES 快速發展的一個重要原因

搜索服務

搜索服務,典型場景包含:商品搜索,類似京東、淘寶、拼多多中的商品搜索;APP 搜索,支持應用商店裡的應用搜索;站內搜索,支持論壇、在線文檔等搜索功能。我們支持了大量搜索服務,它們主要有以下特點:

  • 高性能:單個服務最大達到 10w+ QPS,平響 20ms~,P95 延時小於 100ms。
  • 強相關:搜索體驗主要取決於搜索結果是否高度匹配用戶意圖,需要通過正確率、召回率等指標進行評估。
  • 高可用:搜索場景通常要求高可用性,支持單機房故障容災。任何一個電商服務,如淘寶、京東、拼多多,只要故障一個小時就可以上頭條。

時序數據分析

時序數據分析,典型的時序數據包含:Metrics,即傳統的服務器監控;整個騰訊雲的監控都是基於 ES 的。APM,應用性能監控;物聯網數據,智能硬件、工業物聯網等產生的傳感器數據。時序數據的特點是寫入吞吐量特別高,ES 支持的同時也提供了豐富的多維統計分析算子。這類場景具有以下特點:

  • 高併發寫入:線上單集群最大規模達到 600+節點、1000w/s 的寫入吞吐。

  • 高查詢性能:要求單條曲線 或者單個時間線的查詢延時在 10ms~。

  • 多維分析:要求靈活、多維度的統計分析能力,比如我們在查看監控的時候,可以按照地域、業務模塊等靈活的進行統計分析。

上面通過騰訊的案例我們了解了三大應用場景,

  • 日誌實時分析場景

  • 搜索服務

  • 時序數據分析

另外從這三大應用場景我們也可以歸納出ES的幾大優勢:

1、具有高可用性、高擴展性;

2、查詢速度快,性能佳;

3、搜索功能強大,高度匹配用戶意圖。

因此,可以看出,ES在日誌實時分析和搜索方面的應用優勢簡直是無敵的!起碼目前,在這兩方面,還沒有強勁的對手!

ElasticSearch在京東的應用

通過京東的案例,聊一聊ES在查詢、檢索、數據分析方面的應用場景

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

由於較高的性能和較低的使用門檻,京東內部有很多的場景都在使用 Elasticsearch。覆蓋了京東多條業務線,同時也覆蓋了很多應用場景:

補充關係型數據庫的結構化數據查詢

主要應用的業務是商品、促銷、優惠券、訂單、收銀台、物流、對賬、評論等大數據量查詢。此場景的核心訴求是高性能、穩定性和高可用性,部分場景會有檢索要求,通常用於加速關係型數據庫,業務系統通過 binlog 同步或業務雙寫完成數據同步。

全文檢索功能

主要的應用場景是應用、安全、風控、交易等操作日誌,以及京東部分品類商品搜索。此類日誌化場景對寫要求很高,查詢性能及高可用等要求相對較低,大的業務寫會達到數千萬 / 秒,存儲以 PB 為單位來計算。
這些場景對磁盤、內存有比較高的要求,因此,京東也做了相應優化,用於減少內存消耗,提升磁盤整體使用率,使用更廉價的磁盤來降低成本等等。

實時數據分析引擎,形成統計報表

主要應用的業務是物流單的各種分析、訂單數據分析、用戶畫像等。因為業務數據分析緯度較多,flink、storm 等流式分析對於某些報表場景不太適用,批處理實時性又成為問題,所以近實時分析的 Elasticsearch 就成為了這些業務的選擇。

從京東的案例中,我們似乎看到了,可以利用ES在某些場景下代替關係型數據庫哦!不僅如此,ES在實時數據分析領域,居然也有一席之地!

ElasticSearch在去哪兒的應用

通過去哪兒的案例,聊一聊ES在查詢方面的應用場景,可以簡單的理解為”代替”mysql。注意代替加了引號,閉着眼睛想都不可能完全代替。比如事務性。

15年去哪兒網酒店日均訂單量達到30w+,隨着多平台訂單的聚合日均訂單能達到100w左右。

原來採用的熱表分庫方式,即將最近6個月的訂單的放置在一張表中,將歷史訂單放在在history表中。history表存儲全量的數據,當用戶查詢的下單時間跨度超過6個月即查詢歷史訂單表,此分表方式熱表的數據量為4000w左右,當時能解決的問題。但是顯然不能滿足攜程藝龍訂單接入的需求。

如果繼續按照熱表方式,數據量將超過1億條。全量數據表保存2年的可能就超過4億的數據量。所以尋找有效途徑解決此問題迫在眉睫。由於對這預計4億的數據量還需按照預定日期、入住日期、離店日期、訂單號、聯繫人姓名、電話、酒店名稱、訂單狀態……等多個條件查詢。所以簡單按照某一個維度進行分表操作沒有意義。

顯然只通過DB來支撐大量的查詢是不可取的,同時對於一些複雜的查詢,Mysql支持得不夠友好,所以Elasticsearch分佈式搜索儲存集群的引入,就是為了解決訂單數據的存儲與搜索的問題。

對訂單模型進行抽象和分類,將常用搜索字段和基礎屬性字段剝離。DB做分庫分表,存儲訂單詳情;Elasticsearch存儲搜素字段。

訂單複雜查詢直接走Elasticsearch,基於OrderNo的簡單查詢走DB,如下圖所示。

從去哪兒的案例中,我們似乎看到了,關係型數據庫撐不起的複雜查詢,ES可以勝任

總結

什麼時候應該用ElasticSearch?

1、典型搜索場景:閉着眼用它!

2、典型日誌分析場景:閉着眼用它!

3、關係型數據庫查詢有瓶頸:考慮下用它!為啥是考慮?ES的優點在於查詢,然而實踐證明,在被作為數據庫來使用,即寫完馬上查詢會有延遲。

4、數據分析場景:考慮下用它!為啥是考慮?簡單通用的場景需求可以大規模使用,但在特定業務場景領域,還是要選擇更加專業的數據產品,如複雜聚合,ClickHouse相比 Elasticserach 做億級別數據深度聚合需求會更加合適。

ElasticSearch有什麼優勢呢?

1、很簡便的橫向擴容,分佈式的架構,可以輕鬆地對資源進行橫向縱向擴縮容,可以滿足不同數據量級及查詢場景對硬件資源的需求。能由數百台到萬台機器搭建滿足PB級的快速搜索,也能搭建單機版服務小公司。

2、查詢速度快:ES底層採用Lucene作為搜索引擎,並在此之上做了多重優化,保證了用戶對數據查詢數據的需求。可”代替”傳統關係型數據庫,也可用於複雜數據分析,海量數據的近實時處理等。

3、相關性高:ES內部提供了完善的評分機制,會根據分詞出現的頻次等信息對文檔進行相關性排序,保證相關性越高的文檔排序越靠前。另外還提供了包括模糊查詢,前綴查詢,通配符查詢等在內的多種查詢手段,幫助用戶快速高效地進行檢索。

4、功能點多但使用比較簡便,開箱即用,性能優化比較簡單

5、生態圈豐富,社區活躍,適配多種工具。如下圖,處理日誌和輸出到Elasticsearch,您可以使用日誌記錄工具,如Logstash(www.elastic.co/products/logstash),搜索和可視化界面分析這些日誌,你可以使用Kibana(www.elastic.co/產品/ kibana),即傳說中的ELK技術棧。另外當前主流的大數據框架也幾乎都支持ES,比如Flink和ES就是個完美搭檔。

本文參考:

騰訊萬億級 Elasticsearch 技術解密

搜索引擎怎麼選?攜程酒店訂單Elasticsearch實戰

Elasticsearch在京東的使用場景

本文來源於公眾號:【胖滾豬學編程】。一枚集顏值與才華於一身,不算聰明卻足夠努力的女程序媛。用漫畫形式讓編程so easy and interesting!求關注!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※評比南投搬家公司費用收費行情懶人包大公開

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

CTR學習筆記&代碼實現6-深度ctr模型 後浪 xDeepFM/FiBiNET_網頁設計公司

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

xDeepFM用改良的DCN替代了DeepFM的FM部分來學習組合特徵信息,而FiBiNET則是應用SENET加入了特徵權重比NFM,AFM更進了一步。在看兩個model前建議對DeepFM, Deep&Cross, AFM,NFM都有簡單了解,不熟悉的可以看下文章最後其他model的博客鏈接。

以下代碼針對Dense輸入更容易理解模型結構,針對spare輸入的代碼和完整代碼
https://github.com/DSXiangLi/CTR

xDeepFM

模型結構

看xDeepFM的名字和DeepFM相似都擁有Deep和Linear的部分,只不過把DeepFM中用來學習二階特徵交互的FM部分替換成了CIN(Compressed Interactino Network)。而CIN是在Deep&Cross的DCN上進一步改良的得到。整體模型結構如下

我們重點看下CIN的部分,和paper的notation保持一致,有m個特徵,每個特徵Embedding是D維,第K層的CIN有\(H_k\)個unit。CIN第K層的計算分為3個部分分別對應圖a-c:

  1. 向量兩兩做element-wise product, 時間複雜度\(O(m*H_{k-1}*D)\)
    對輸入層和第K-1層輸出,做element-wise乘積進行兩兩特徵交互,得到\(m*H_{k-1}\)個D維向量矩陣,如果CIN只有一層,則和FM, NFM,AFM的第一步相同。FM 直接聚合成scaler,NFM沿D進行sum_pooling,而AFM加入Attention沿D進行weighted_pooling。忽略batch的矩陣dimension變化如下

\[z^k = x^0 \odot x^{k-1} = (D * m* 1) \odot (D * 1* H_{k-1}) = D * m*H_{k-1} \]

  1. Feature Map,空間複雜度\(O(H_k *H_{k-1} *m)\),時間複雜度\(O(H_k *H_{k-1} *m*D)\)
    \(W_k \in R^{H_{k-1}*m *H_k}\) 是第K層的權重向量,可以理解為沿Embedding做CNN。每個Filter對所有兩兩乘積的向量進行加權求和得到 \(1*D\)的向量 一共有\(H_k\)個channel,輸出\(H_k * D\)的矩陣向量。

\[w^k \bullet z^k = (H_k *H_{k-1} *m)* (m*H_{k-1}*D) = H_k *D \]

  1. Sum Pooling
    CIN對每層的輸出沿Dimension進行sum pooling,得到\(H_k*1\)的輸出,然後把每層輸出concat以後作為CIN部分的輸出。

CIN每一層的計算如上,T層CIN每一層都是上一次層的輸出和第一層的輸入進行交互得到更高一階的交互信息。假設每層維度一樣\(H_k=H\), CIN 部分整體時間複雜度是\(O(TDmH^2)\),空間複雜度來自每層的Filter權重\(O(TmH^2)\)

CIN保留DCN的任意高階和參數共享,兩個主要差別是

  • DCN是bit-wise,CIN是vector-wise。DCN在做向量乘積時不區分Field,直接對所有Field拼接成的輸入(m*D)進行外積。而CIN考慮Field,兩兩vector進行乘積
  • DCN使用了ResNet因為多項式的核心只用輸出最後一層,而CIN則是每層都進行pooling后輸出

CIN的設計還是很巧妙滴,不過。。。吐槽小分隊上線: CIN不論是時間複雜度還是空間複雜度都比DCN要高,感覺更容易過擬合。至於說vector-wise的向量乘積要比bit-wise的向量乘積要好,這。。。至少bit-wise可以不限制embedding維度一致, 但vector-wise嘛我實在有些理解無能,明白的童鞋可以comment一下

代碼實現

def cross_op(xk, x0, layer_size_prev, layer_size_curr, layer, emb_size, field_size):
    # Hamard product: ( batch * D * HK-1 * 1) * (batch * D * 1* H0) -> batch * D * HK-1 * H0
    zk = tf.matmul( tf.expand_dims(tf.transpose(xk, perm = (0, 2, 1)), 3),
                    tf.expand_dims(tf.transpose(x0, perm = (0, 2, 1)), 2))

    zk = tf.reshape(zk, [-1, emb_size, field_size * layer_size_prev]) # batch * D * HK-1 * H0 -> batch * D * (HK-1 * H0)
    add_layer_summary('zk_{}'.format(layer), zk)

    # Convolution with channel = HK: (batch * D * (HK-1*H0)) * ((HK-1*H0) * HK)-> batch * D * HK
    kernel = tf.get_variable(name = 'kernel{}'.format(layer),
                             shape = (field_size * layer_size_prev, layer_size_curr))
    xkk = tf.matmul(zk, kernel)
    xkk = tf.transpose(xkk, perm = [0,2,1]) # batch * HK * D
    add_layer_summary( 'Xk_{}'.format(layer), xkk )
    return xkk


def cin_layer(x0, cin_layer_size, emb_size, field_size):
    cin_output_list = []

    cin_layer_size.insert(0, field_size) # insert field dimension for input
    with tf.variable_scope('Cin_component'):
        xk = x0
        for layer in range(1, len(cin_layer_size)):
            with tf.variable_scope('Cin_layer{}'.format(layer)):
                # Do cross
                xk = cross_op(xk, x0, cin_layer_size[layer-1], cin_layer_size[layer],
                              layer, emb_size, field_size ) # batch * HK * D
                # sum pooling on dimension axis
                cin_output_list.append(tf.reduce_sum(xk, 2)) # batch * HK

    return tf.concat(cin_output_list, axis=1)

@tf_estimator_model
def model_fn_dense(features, labels, mode, params):
    dense_feature, sparse_feature = build_features()
    dense_input = tf.feature_column.input_layer(features, dense_feature)
    sparse_input = tf.feature_column.input_layer(features, sparse_feature)

    # Linear part
    with tf.variable_scope('Linear_component'):
        linear_output = tf.layers.dense( sparse_input, units=1 )
        add_layer_summary( 'linear_output', linear_output )

    # Deep part
    dense_output = stack_dense_layer( dense_input, params['hidden_units'],
                               params['dropout_rate'], params['batch_norm'],
                               mode, add_summary=True )
    # CIN part
    emb_size = dense_feature[0].variable_shape.as_list()[-1]
    field_size = len(dense_feature)
    embedding_matrix = tf.reshape(dense_input, [-1, field_size, emb_size]) # batch * field_size * emb_size
    add_layer_summary('embedding_matrix', embedding_matrix)

    cin_output = cin_layer(embedding_matrix, params['cin_layer_size'], emb_size, field_size)

    with tf.variable_scope('output'):
        y = tf.concat([dense_output, cin_output,linear_output], axis=1)
        y = tf.layers.dense(y, units= 1)
        add_layer_summary( 'output', y )

    return y

FiBiNET

模型結構

看FiBiNET前可以先了解下Squeeze-and-Excitation Network,感興趣可以看下這篇博客Squeeze-and-Excitation Networks。

FiBiNET的主要創新是應用SENET學習每個特徵的重要性,加權得到新的Embedding矩陣。在FiBiNET之前,AFM,PNN,DCN和上面的xDeepFM都是在特徵交互之後才用attention, 加權等方式學習特徵交互的權重,而FiBiNET在保留這部分的同時,在Embedding部分就考慮特徵自身的權重。模型結構如下

原始Embedding,和經過SENET調整過權重的新Embedding,在Bilinear-interaction層學習二階交互特徵,拼接后,再經過MLP進一步學習高階特徵。和paper notation保持一致(啊啊啊大家能不能統一下notation搞的我自己看自己的註釋都蒙圈),f個特徵,k維embedding

SENET層

SENET層學習每個特徵的權重對Embedding進行加權,分為以下3步

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

  1. Squeeze
    \(f*k\)的Embedding矩陣壓縮成\(f*1\), 壓縮方式不固定,SENET原paper用的max_pooling,作者用的sum_pooling,感覺這裏壓縮方式應該取決於Embedding的信息表達

\[\begin{align} E &= [e_1,…,e_f] \\ Z &= [z_1,…,z_f] \\ z_i &= F_{squeeze}(e_i) = \frac{1}{k}\sum_{i=1}^K e_i \\ \end{align} \]

  1. Excitation
    Excitation是一個兩層的全連接層,通過先降維再升維的方式過濾一些無用特徵,降維的幅度通過額外變量\(r\)來控制,第一層權重\(W_1 \in R^{f*f/r}\),第二層權重\(W_2 \in R^{f/r*f}\)。這裏r越高,壓縮的幅度越高,最終的權重會更集中,反之會更分散。

\[A = \sigma_2(W_2·\sigma_1(W_1·Z)) \]

  1. Re-weight
    最後一步就是用Excitation得到的每個特徵的權重對Embedding進行加權得到新Embedding

\[E_{new} = F_{Reweight}(A,E) = [a_1·e_1, …,a_f·e_f ] \]

在收入數據集上進行嘗試,r=2時會有46%的embedding特徵權重為0,所以SENET會在特徵交互前先過濾部分對target無用的特徵來增加有效特徵的權重

Bilinear-Interaction層

作者提出內積和element-wise乘積都不足以捕捉特徵交互信息,因此進一步引入權重W,以下面的方式進行特徵交互

\[v_i · W \odot v_j \]

其中W有三種選擇,可以所有特徵交互共享一個權重矩陣(Field-All),或者每個特徵和其他特徵的交互共享權重(Field-Each), 再或者每個特徵交互一個權重(Field-Interaction) 具體的優劣感覺需要casebycase來試,不過一般還是照着數據越少參數越少的邏輯來整。

原始Embedding和調整權重后的Embedding在Bilinear-Interaction學習交互特徵后,拼接成shallow 層,再經過全連接層來學習更高階的特徵交互。後面的屬於常規操作這裏就不再細說。

我們不去吐槽FiBiNET可以加入wide&deep框架來捕捉低階特徵信息和任意高階信息,更多把FiBiNET提供的SENET特徵權重的思路放到自己的工具箱中就好。

代碼實現

def Bilinear_layer(embedding_matrix, field_size, emb_size, type, name):
    # Bilinear_layer: combine inner and element-wise product
    interaction_list = []
    with tf.variable_scope('BI_interaction_{}'.format(name)):
        if type == 'field_all':
            weight = tf.get_variable( shape=(emb_size, emb_size), initializer=tf.truncated_normal_initializer(),
                                      name='Bilinear_weight_{}'.format(name) )
        for i in range(field_size):
            if type == 'field_each':
                weight = tf.get_variable( shape=(emb_size, emb_size), initializer=tf.truncated_normal_initializer(),
                                          name='Bilinear_weight_{}_{}'.format(i, name) )
            for j in range(i+1, field_size):
                if type == 'field_interaction':
                    weight = tf.get_variable( shape=(emb_size, emb_size), initializer=tf.truncated_normal_initializer(),
                                          name='Bilinear_weight_{}_{}_{}'.format(i,j, name) )
                vi = tf.gather(embedding_matrix, indices = i, axis =1, batch_dims =0, name ='v{}'.format(i)) # batch * emb_size
                vj = tf.gather(embedding_matrix, indices = j, axis =1, batch_dims =0, name ='v{}'.format(j)) # batch * emb_size
                pij = tf.matmul(tf.multiply(vi,vj), weight) # bilinear : vi * wij \odot vj
                interaction_list.append(pij)

        combination = tf.stack(interaction_list, axis =1 ) # batch * emb_size * (Field_size * (Field_size-1)/2)
        combination = tf.reshape(combination, shape = [-1, int(emb_size * (field_size * (field_size-1) /2)) ]) # batch * ~
        add_layer_summary( 'bilinear_output', combination )

    return combination


def SENET_layer(embedding_matrix, field_size, emb_size, pool_op, ratio):
    with tf.variable_scope('SENET_layer'):
        # squeeze embedding to scaler for each field
        with tf.variable_scope('pooling'):
            if pool_op == 'max':
                z = tf.reduce_max(embedding_matrix, axis=2) # batch * field_size * emb_size -> batch * field_size
            else:
                z = tf.reduce_mean(embedding_matrix, axis=2)
            add_layer_summary('pooling scaler', z)

        # excitation learn the weight of each field from above scaler
        with tf.variable_scope('excitation'):
            z1 = tf.layers.dense(z, units = field_size//ratio, activation = 'relu')
            a = tf.layers.dense(z1, units= field_size, activation = 'relu') # batch * field_size
            add_layer_summary('exciitation weight', a )

        # re-weight embedding with weight
        with tf.variable_scope('reweight'):
            senet_embedding = tf.multiply(embedding_matrix, tf.expand_dims(a, axis = -1)) # (batch * field * emb) * ( batch * field * 1)
            add_layer_summary('senet_embedding', senet_embedding) # batch * field_size * emb_size

        return senet_embedding

@tf_estimator_model
def model_fn_dense(features, labels, mode, params):
    dense_feature, sparse_feature = build_features()
    dense_input = tf.feature_column.input_layer(features, dense_feature)
    sparse_input = tf.feature_column.input_layer(features, sparse_feature)

    # Linear part
    with tf.variable_scope('Linear_component'):
        linear_output = tf.layers.dense( sparse_input, units=1 )
        add_layer_summary( 'linear_output', linear_output )

    field_size = len(dense_feature)
    emb_size = dense_feature[0].variable_shape.as_list()[-1]
    embedding_matrix = tf.reshape(dense_input, [-1, field_size, emb_size])

    # SENET_layer to get new embedding matrix
    senet_embedding_matrix = SENET_layer(embedding_matrix, field_size, emb_size,
                                         pool_op = params['pool_op'], ratio= params['senet_ratio'])

    # combination layer & BI_interaction
    BI_org = Bilinear_layer(embedding_matrix, field_size, emb_size, type = params['bilinear_type'], name = 'org')
    BI_senet = Bilinear_layer(senet_embedding_matrix, field_size, emb_size, type = params['bilinear_type'], name = 'senet')

    combination_layer = tf.concat([BI_org, BI_senet] , axis =1)

    # Deep part
    dense_output = stack_dense_layer(combination_layer, params['hidden_units'],
                               params['dropout_rate'], params['batch_norm'],
                               mode, add_summary=True )

    with tf.variable_scope('output'):
        y = dense_output + linear_output
        add_layer_summary( 'output', y )

    return y

CTR學習筆記&代碼實現系列

https://github.com/DSXiangLi/CTR
CTR學習筆記&代碼實現1-深度學習的前奏 LR->FFM
CTR學習筆記&代碼實現2-深度ctr模型 MLP->Wide&Deep
CTR學習筆記&代碼實現3-深度ctr模型 FNN->PNN->DeepFM
CTR學習筆記&代碼實現4-深度ctr模型 NFM/AFM
CTR學習筆記&代碼實現5-深度ctr模型 DeepCrossing -> Deep&Cross

Ref

  1. Jianxun Lian, 2018, xDeepFM: Combining Explicit and Implicit Feature Interactions for Recommender Systems
  2. Tongwen Huang, 2019, FiBiNET: Combining Feature Importance and Bilinear feature Interaction for Click-Through Rate Prediction
  3. Jie Hu, 2017, Squeeze-and-Excitation Networks
  4. https://zhuanlan.zhihu.com/p/72931811
  5. https://zhuanlan.zhihu.com/p/79659557
  6. https://zhuanlan.zhihu.com/p/57162373
  7. https://github.com/qiaoguan/deep-ctr-prediction

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。